객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재(this와 비슷/static 메서드 내에서 사용불가)
조상의 멤버를 자신의 멤버와 구별할 때 사용(this는 lv와 iv 구별에 사용)
- 이름은 같아도 x가 2개 만들어지고 조상의 x (=super.x)는 10, 자손의 x(=this.x)는 20의 값을 가진다.
- 조상의 x에는 10이라는 값이 있고, 자손의 x에는 값이 없을 때, 자손의 x가 조상의 x값을 상속받아 10이 된다. (x가 하나밖에 없기 때문에 super.x와 this.x의 역할을 동시에 한다.)
조상의 생성자를 호출할 때 사용
조상의 멤버는 조상의 생성자를 호출해서 초기화
- 참조변수 super와 전혀 다른 것!(super는 참조변수 / super()는 생성자)
- 생성자, 초기화 블럭은 상속 X
- 조상의 멤버를 자손의 생성자가 초기화 하고 있다.(잘못된 예시)
- 자손의 생성자는 자신이 선언한 것만 초기화 해야 한다.
- 조상의 생성자를 호출해서 조상의 멤버를 초기화한다.
- 자손은 자신의 멤버만 초기화한다.
생성자의 첫 줄에 반드시 생성자를 호출해야 한다.(= this() 또는 super()를 삽입해야 한다.) 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
- Point() {this(0,0);}은 자신의 생성자를 호출했기 때문에 Ok!
- Point(int x, int y) {this.x = x; this.y = y;}는 생성자 호출이 아니기 때문에 컴파일러가 자동으로 this.x=x; 앞에 super();를 넣어 조상의 기본 생성자를 호출하는 코드를 넣는다.
- super(); = Object의 기본 생성자를 호출하는 코드가 된다.
Ex)
- Point3D를 생성해서 실행하면 컴파일러 에러 발생!
- Point 생성자가 없어서 에러가 발생!
- 에러 발생 위치 = Point3D(int x, int y, int z){}
- 모든 생성자는 첫 줄에 다른 생성자를 호출해야 하는데, Point(){}에서 다른 생성자를 호출하지 않기 때문에 컴파일러가 자동으로 super();를 추가한다.
- Point3D 역시 첫 줄에 생성자 호출을 하지 않으므로, 컴파일러가 super();를 추가한다.
- Point(){}의 super();는 Object의 생성자 / Point3D(){}의 suepr();는 Point()를 호출
- 그런데, Point를 호출하는데, 이미 생성자가 있기 때문에, Point3D()의 기본 생성자 Point()를 컴파일러가 자동으로 넣어주지 않는다.
- 그래서 클래스를 만들 때, 기본 생성자를 작성하는 것을 필수 작업이다!
- 에러 해결을 위해 1.point()생성자를 추가해준다. / 2. 기본생성자를 호출하지 않도록 코드를 아래와 같이 바꾼다.
서로 관련된 클래스의 묶음
클래스는 클래스 파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
클래스의 실제 이름(full name)은 패키지를 포함(java.lang.String)
rt(=runtime).jar는 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)
- runtime = 실행할 때 실행 중을 의미 / 자바 프로그램이 실행될 때 필요한 클래스들을 묶어놓은 것.
- jar = 클래스파일 묶어놓은 것
패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
패키지 선언이 없으면 이름없는(unnamed)패키지에 속하게 된다.
클래스 파일(*.class)의 위치를 알려주는 경로(path)
환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용
- 환경변수 = os에서 관리하는 변수
classpath(환경변수)에 패키지의 루트를 등록해줘야 함