일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 미니마카
- 웹API
- 헤이큐
- 영어시간읽기
- 암홀트롭
- 40HQ컨테이너
- 필터링후복사붙여넣기
- 우레탄지퍼
- AATCC
- 봉제용어
- 40HQ컨테이너40GP컨테이너차이
- 고급영어단어
- 엑셀자동서식
- 엑셀드래그단축키
- 비슬론지퍼
- 핸드캐리쿠리어차이점
- 비리짐
- 엑셀필터복사붙여넣기
- 미국영어연음
- 와끼
- 클린코드
- 요척합의
- 슈퍼코딩
- 자켓실측
- WHATTIMEOFTHEDAY
- Armhole Drop
- 나일론지퍼
- TACKING
- MERN스택
- 지연환가료
- Today
- Total
CASSIE'S BLOG
[슈퍼코딩] 30강 static과 변수유효범위 본문
static이 왜 필요한지 알려면 이슈를 알면 이해하기가 편하다고함.
필드를 하나 출력하려고 하는데 그게 학번 아이디다.
이게 학교라는 시스템에서 각 학생의 고유한 번호를 자동으로 입력하는 변수라고 설정을 해보겠다.
문제가 인스턴스를 만들 때마다 즉 studentId를 1씩 올릴려고 하는데 어떤걸 참고해서 추적하는게 있어야 제가 1씩 올릴 거 아니에요.
아무것도 없는데 어떻게 인스턴스 만들 때마다 1씩 올려요.
그래서 학번을 추적하는 정보를 넣을거라고함.
학번을 추적하는 정보가 이번에는 2를 만들어야합니다. 이번에는 3을 만들어야합니다. 이런 식으로 즉 각각의 개체들 각각의 인스턴트들이 공통으로 보고 있는 곳이 있어야한다. 공동으로 관리하고 있는 영역이 있어야한다. 그래야 객체가 만들어질 때 아 나는 아이디가 3이구나 그래서 공동경비구역같은 공간이 필요하다.
static변수는 인스턴스가 "모두 같은" 걸 공유하고 있는 변수다.
package exercise.chapter_30;
public class Student {
//맨처음에 1로 초기화 어떻게 1로 올릴거냐 생성자를 사용할 예정
static int serialNum = 1;
//속성
private String schoolName;
private int classYear;
private int classroomNumber;
private int studentNumber;
private int studentId;
//기본정보
private String name;
private String gender;
public Student() {
}
public Student(String pName, String pGender) {
name = pName;
gender = pGender;
}
//아무것도 안 적으면 default
Student(String schoolName, int classYear, int classroomNumber, int studentNumber, int studentId, String name, String gender) {
//생성자의 parameter에 serialNum을 넣는게 아니라 스스로 알아서 올라가라고 그냥 this.studentId = serialNum;
//++ 하면 1씩 들어간다.
//처음에는 초기화값된 값이 들어가고. 이후에 그게 끝나면은 1씩 올라가라 이 뜻임.
this.studentId = serialNum++;
this.schoolName = schoolName;
this.classYear = classYear;
this.classroomNumber = classroomNumber;
this.studentNumber = studentNumber;
this.studentId = studentId;
this.name = name;
this.gender = gender;
}
public String getName() {
return this.name;
}
}
studentID 1씩 증가하는 거 만드는 법
package exercise.chapter_30;
public class StaticTest {
public static void main(String[] args){
//4명 정도 만들기
Student student1 = new Student("Alice", "Female");
Student student2 = new Student("Tom", "Male");
Student student3 = new Student("Taylor", "Female");
Student student4 = new Student("Mike", "Male");
student1.printMyInfo();
student2.printMyInfo();
student3.printMyInfo();
student4.printMyInfo();
}
}
생성자에서 this.studentID = studentID 이걸 없애야함
package exercise.chapter_30;
public class Student {
//맨처음에 1로 초기화 어떻게 1로 올릴거냐 생성자를 사용할 예정
static int serialNum = 1;
//속성
String schoolName;
private int classYear;
private int classroomNumber;
private int studentNumber;
private int studentID;
//기본정보
private String name;
private String gender;
public Student() {
}
Student(String name, String gender) {
this("school", 1, 3,-1, name, gender);
}
public void printMyInfo(){
System.out.printf("[Student] schoolName: %s, classYear: %d, classroomNumber: %d, " +
"studentNumber: %d, studentId: %d, name: %s, gender: %s\n",
this.schoolName, this.classYear, this.classroomNumber, this.studentNumber, this.studentID,
this.name, this.gender
);
}
//아무것도 안 적으면 default
Student(String schoolName, int classYear, int classroomNumber, int studentNum, String name, String gender) {
//생성자의 parameter에 serialNum을 넣는게 아니라 스스로 알아서 올라가라고 그냥 this.studentId = serialNum;
//++ 하면 1씩 들어간다.
//처음에는 초기화값된 값이 들어가고. 이후에 그게 끝나면은 1씩 올라가라 이 뜻임.
this.studentID = serialNum++;
this.schoolName = schoolName;
this.classYear = classYear;
this.classroomNumber = classroomNumber;
this.studentNumber = studentNum;
this.name = name;
this.gender = gender;
}
public String getName() {
return this.name;
}
}
그래서 생성자에 추적하는 값
이게 필요한 것임.
생성자 매개변수는 6개이고
밑에 정의하는 건 7개 필드임.
this.studentID = serialNum++;
static 안 붙이고 하면 계속 1임 그리고 생성자에서 바꿔치기 하면
private int serialNum2 = 1;
static을 안 붙였기 때문에 그냥 한 객체가
가지고 있다. 다른 객체가 하나 가지고 다른 객체는 아무 상관 없다.
static을 붙이면 모든 객체가 그
친구를 바라본다.
static 변수 = 정적 변수
정적이라는 말이 변하지 않는다의 정적이 아니라 클래스에 속해있다는
말이라고 함
클래스는 설계도라고 했잖아
설계도에 정적으로 같이 있다. 그래서 정적변수라고 한다고 함
static은 그냥 설계도 도면에 영향을 끼친다. 생각하면 된다고 함
정리하면
static = 정적 변수
= 프로그램 실행 시 정적 생성,
(인스턴스 생성 전 정의 되어 있음)
즉 new라는 걸로 인스턴스화 시키지않아도 이미 생성되어 있는 변수가 됩니다.
static 안 붙인 친구들은 멤버변수 (=속성) 이 되고 각 인스턴스에 속하는 친구들이다.
static 변수는 클래스에 속해있기 때문에 클래스 변수라고도 한다.
클래스로 바로 호출도 가능하다.
이렇게
int num2 = student1.serialNums;
인스턴스를 하지 않고도 부를 수 있다.
사실 객체에서도 접근이 가능하다.
객체는 클래스를 바탕으로 만들어진거라서
클래스 변수
인스턴스 변수
로컬 변수
이렇게 범위가 점점 작아짐
- public : 클래스(Class) 외부에서 사용할 수 있도록 공개
- private : 클래스(Class) 외부에서 사용할 수 없도록 비공개
- protected : 클래스(Class) 외부에서 사용할 수 없도록 비공개하지만, 상속받은 자식 클래스에게만 사용할 수 있도록 공개
자바는 private과 protected를 통해 외부에서 접근을 못하도록 할 수 있기 때문에, 자료의 은폐화 혹은 캡슐화(Encapsulation, 인캡슐레이션) 를 가질 수 있는 언어라고 말한다.
이 부분 출처:
https://caileb.tistory.com/139
변수
변수에는 세종류가 있습니다. 클래스변수, 인스턴스변수, 지역변수 변수의 종류를 나누는 기준은 변수의 선언 된 위치입니다.
• 지역변수(local variable) : 멤버변수를 제외한 나머지 변수
• 클래스변수(classvariable) : 멤버변수
중 static이 붙은 것
• 인스턴스변수(instance vatiable) : 멤버변수 중 staticol 붙지 않은 것.
'PROGRAMMING > 슈퍼코딩 강의 정리' 카테고리의 다른 글
[슈퍼코딩] 31강 객체의 상속 v1 + generate 단축키 설정 (option + i) (0) | 2023.12.12 |
---|---|
[슈퍼코딩] 28강 자기 자신을 가르키는 this (0) | 2023.12.11 |
[슈퍼코딩] 34-1강 객체 상속 실무 (부제: 백화점 관리 시스템) (0) | 2023.12.10 |
[슈퍼코딩] 54강 강력한 데이터 관리(2) (0) | 2023.12.10 |
[슈퍼코딩] 53강 강력한 데이터 관리 (부제: Enum, DateTime, Optional) (0) | 2023.12.10 |