Day 25

ChangWoo·2023년 4월 29일
0

자바의 정석

목록 보기
25/71
post-thumbnail

ch 7-10,11 참조변수 super, 생성자 super()

참조변수 super

객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재(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는 참조변수 / super()는 생성자)
  • 생성자, 초기화 블럭은 상속 X
  • 조상의 멤버를 자손의 생성자가 초기화 하고 있다.(잘못된 예시)
  • 자손의 생성자는 자신이 선언한 것만 초기화 해야 한다.
  • 조상의 생성자를 호출해서 조상의 멤버를 초기화한다.
  • 자손은 자신의 멤버만 초기화한다.

super() - 조상의 생성자

생성자의 첫 줄에 반드시 생성자를 호출해야 한다.(= 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. 기본생성자를 호출하지 않도록 코드를 아래와 같이 바꾼다.

ch 7-12~14 패키지, 클래스 패스

패키지(package)

서로 관련된 클래스의 묶음
클래스는 클래스 파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
클래스의 실제 이름(full name)은 패키지를 포함(java.lang.String)
rt(=runtime).jar는 클래스들을 압축한 파일(JDK설치경로\jre\lib에 위치)

  • runtime = 실행할 때 실행 중을 의미 / 자바 프로그램이 실행될 때 필요한 클래스들을 묶어놓은 것.
  • jar = 클래스파일 묶어놓은 것

패키지의 선언

패키지는 소스파일의 첫 번째 문장으로 단 한번 선언
같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
패키지 선언이 없으면 이름없는(unnamed)패키지에 속하게 된다.

클래스 패스(classpath)

클래스 파일(*.class)의 위치를 알려주는 경로(path)
환경변수 classpath로 관리하며, 경로간의 구분자는 ';'를 사용

  • 환경변수 = os에서 관리하는 변수
    classpath(환경변수)에 패키지의 루트를 등록해줘야 함
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글