1) Class
Array에 대해서 배우려면 일단 클래스에 대해서 알고 있어야 할것같아서..
1-1. Class의 구성
[modifiers] class Class이름 {
[modifiers] data_type attribute이름; // 멤버변수
[modifier] Class이름(...){...}; // 생성자
[modifier] return_type method이름 ([arguments]){...} // 멤버메서드
}
- modifier : 접근제한자
- 표면적으로 파이썬이랑 크게 다른 부분은 없어보입니다.
1-2. Constructor
-
객체 초기화 작업을 수행함
-
리턴값이 없어야함
반드시 생성자가 존재해야함. (물론 적지 않으면 컴파일러가 자동으로 만들어줌.)
-
Constructor Overloading : 여러 생성자 선언 가능 (함수의 인자만 달라지면됨!)
1-3. this variable
-
this : 객체의 레퍼런스들 정보를 저장하기 위한 레퍼런스
=> this를 통해서 객체의 모든 정보에 접근가능하다!
-
Class Method 내에서 변수 우선순위
- Local variable
- this가 참조하고 있는 variable
(실험)
public static class Member { /* Error! java: non-static variable this cannot be referenced from a static context */ int id; // Error! java: cannot find symbol : variable id public Member(int id) { this.id = id; } public void getinfo(int id){ System.out.println("Member id :" + id); } //overloading public void getinfo(){ System.out.println("Member id :" + id); } } public static void main(String[] args){ Member m = new Member(1); m.getinfo(2); m.getinfo(); }
Member id :2 // 로컬변수 참조 Member id :1 // this변수 참조
-
항상 자바에서는 this.id의 주소에 참조하기 전에 this.id 를 미리 선언을 해야한다.
클래스 내에서 선언을 하는거니까 그냥
int id
라고만 하면 된다.(파이썬에서는 그냥 되던데…)
-
Class 앞에 static 키워드를 쓰지 않으니
Non-static variable은 static context에 참조될수가 없다는 에러가 뜹니다.
일단 static이라고 바꾸면 해결이 되는데, 무슨문제인지는 다음에 알아보기로..
1-4. Variable LifeCycle
- Member Variable : Heap 영역에 저장됨.
- static :
- class가 만들어질 때 자동으로 초기화됨,
- 클래스 제거시 사라짐.
- instance :
- 객체 생성시에 자동으로 초기화됨.
- 객체 제거시 사라짐.
- static :
- Local Variable : Stack 영역에 생성됨 (함수에 의존하므로)
- method나 constructor가 수행 종료시 사라짐.
1-5. Modifier (제한자)
-
- Access Modifier (클래스 접근에 대한 제한)
-
다른 클래스에서 이 클래스에 접근할 수 있는가?!
- 종류 : private, (default), protected, public
- 권한 : Same class -> Same package -> Subclass -> universe
-
Usage Modifier (클래스 사용에 대한 제한)
- static : 객체 생성없이 사용하고자 할 경우
- final : 변경할 수 없음
- abstract : 미완성
1-6. Static Modifier
-
Static Variables
- 멤버변수 정의 시에 static 키워드를 통해 정의함
- 객체 생성 없이 사용할 수 있음.
사용예시
static변수를 Class2 안에서 선언
public class Class2 { static int count = 0; public Class2(){ count += 1; } public static void main(String[] args){ // 클래스명.멤버변수 이렇게 사용가능함. System.out.println(Class2.count); // 0 Class2 test1 = new Class2(); Class2 test2 = new Class2(); System.out.println(Class2.count); // 2 } }
클래스를 생성할 때 마다 count라는 값이 늘고, 이 값이 공유되기 때문에 출력은 2가 된다.
-
Static method
- 객체 생성 없이 사용할 수 있음.
- 그렇기 때문에 특정 객체의 정보(member variable, member method)를 활용할 수 없음
에러예시)
public class Class2 { static int count = 0; int var = 1; public Class2(){ count += 1; } public static void main(String[] args){ var++; // Class2 클래스의 인스턴스 변수를 활용할 수 없음. } }
그래서 메인메서드 안에서 값을 정의하거나, static variable을 정의해서 쓰는것이 일반적입니다.
-
Static block
클래스가 메모리에 로딩된 후 자동으로 호출됨,
Class3 객체가 여러개 생성되어도 static블록에 있는 문은 최초 단 한번만 실행된다.
public class Class3 { static int count = 0; // static block static { System.out.println("Static initialize"); } public static void main(String[] args){ System.out.println("next..."); } }
Static initialize next...
-
Static class : 이건 nested class에 대해서만 사용가능한데, nested class를 배우면서 알아보도록 합시다. (다음에..)