this
- 자기 자신(=나의 주소) 객체를 지정할 때 사용하는 키워드
// 키워드
this. 동일 클래스 내의 멤버(멤버변수, 메서드)를 참조
this() 생성자 내부에서 자신의 다른 생성자를 호출
원래 이름이 같으면 가장 가까운 위치의 이름을 인식하므로
매개변수의 이름과 멤버변수의 이름을 다르게 지정했었으나
this. 입력하면 매개변수가 나의 멤버변수에 입력이 됨
→ 결과적으로 매개변수, 멤버변수
구분 가능
this( ) - 생성자 연결, 100줄짜리 코드 같은거 있을 때
Person-MainClass - this. & this()
- Person p
- 멤버변수: name, age
- 생성자 설정: this()는 나의 생성자에 접근이 가능하게 함
- this("홍길동", 1); 이면 이름: 홍길동, 나이:1인 생성자가 설정되었으므로 main에서 p.info() 출력
- Person p1
- 멤버변수: name, age
- 생성자 설정: 매개변수 name이 있고, this()로 생성자의 name에 접근 가능하게 하고, 나이:1로 설정
- p1에서 매개변수 name 입력하고 p1.info() 출력
- Person p2
- 멤버변수: name, age
- 생성자 설정: 매개변수 name, age가 있고,
this. 이용하여 매개변수 name -> 멤버변수 name에 저장+ toUpperCase(): 대문자 만들기
/ 매개변수 age -> 멤버변수 age에 저장 - p2에서 매개변수 name, age 입력하고 p2.info() 출력
- Teacher t 는 다른 파일에 있음
Car-MainClass - this. & 메서드 안에서 메서드 호출
- model 전달받아서(= 매개변수로 입력 받는다) model에 저장하는 생성자 생성 -> this. 사용
- (멤버변수 speed는 전달 받지 않으면 알아서 자동 초기화 = 0 됨)
- accel 메서드 생성
- 멤버변수 speed가 150이니까 this.speed 사용
- 매개변수를 멤버변수에 저장해야 하니까 매개변수 speed가 오른쪽, 멤버변수 this.speed가 왼쪽!
- run 메서드 생성
- 메서드 안에서 메서드를 입력받으려면 이름만 불러도 됨 ex) accel();
- i는 accel안의 매개변수니까 스피드이고, 스피드가 30씩 늘어나면서 this.speed가 출력(=멤버변수 speed도 출력)
- main에서 참조타입을 선언하면서 매개변수 model 입력, c. 사용해서 메서드 run() 참조함
super
- 부모클래스(한 단계 위)의 객체를 지정할 때 사용하는 키워드
- 생성자의 첫 라인에는 반드시 this(), super() 있어야 함
명시하지 않으면 자동으로 묵시적으로 super() 삽입
→ 그래서 부모의 기본 생성자가 필수
로직
1) 부모의 매개변수가 없는 기본 생성자를 찾음
부모 클래스에 매개변수가 있는 생성자만 있는 경우 꼭 super()을 이용해 부모 생성자를 호출 필수
2) 자식 클래스의 생성자에서 super()을 명시적으로 지정해주지 않으면 컴파일 시 super()이 추가됨
3) super()은 반드시 자식 클래스의 생성자에서 가장 첫 줄에 선언되어야 한다.
// 키워드
super. 부모 클래스 내의 멤버(멤버변수, 메서드)를 참조 → super(부모님 멤버변수1, 부모님 멤버변수2)
super() 생성자 내부에서 부모클래스의 다른 생성자를 호출 → super.메서드이름()
예제
day06.super_ - super(멤버변수) & super.메서드이름()
- Person(부모 class)의 기본 생성자가 없을 때
Mother 생성자 안 → super("김xx, 20");
Employee 생성자 안 → 부모 생성자 연결, super(name, age) / 본인의 생성자 department - Employee(자식 class)에서 오버라이딩시 메서드도 가져올 수 있음
return super.info() + 추가적으로 필요한 부분 출력
Quiz09 - Airplane, SuperSonicAp
- Airplane 상속받고, 생성자 이름을 부모 class로부터 받아서 초기화 = super()
SuperSonicAp에는 name의 기본생성자가 없는데 부모클래스에는 초기화 되어 있으니까 생성자 그대로 가져옴
본인의 멤버변수는 본인이 초기화 - void fly()변수 오버라이딩. 1이면 고속모드, 0이면 부모클래스 fly메서드 호출 = 메서드or변수는 super.으로 호출
- SuperSonicAp의 메서드 String info()생성해서 name, flyMode 리턴
접근 제한자 (Access Modifier)
- 클래스와 멤버변수, 메서드, 생성자의 접근을 제어할 수 있는 제한자입니다
- 라이브러리 클래스를 설계할 때는 외부 클래스에서 접근할 수 있는 멤버와 접근할 수 없는 멤버로 구분 해서 변수, 생성자, 메서드를 설계하는 것이 바람직합니다
- 외부에서 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 객체의 특정 데이터를 보호하기 위 해 해당 멤버변수에 접근하지 못하도록 막는 것이 접근 제한자의 역할입니다.
- 클래스에는 접근 제한자를 public과 default만 붙일 수 있습니다.
종류
public
같은 클래스, 같은 패키지, 다른 패키지를 막론하고 접근 가능.
private
같은 클래스 내부가 아니면 접근이 불가능 = 밖에서 사용X
protected
같은 클래스, 같은 패키지는 접근 가능 / 다른 패키지에 속해있는 클래스인 경우 상속관계가 없으면 접근 불가능.
상속 관계 접근 가능 = super() 접근 가능
default
(접근 제한자를 붙이지 않는 형태) 같은 클래스, 같은 패키지에서만 접근이 가능하며 패키지가 다를 경우 접근 불가능
예시
day07.modi.cls
- default: 같은 패키지에서만 접근 가능
pakage pac1 ≠ package pac2
day07.modi.constructor
- public: 다른 클래스, 다른 패키지에서도 가능
- default: 다른 클래스 가능, 다른 패키지 불가능
pakace pac1 - class A, B 가능 ≠ package pac2 - private: 같은 클래스에서만 가능
day07.modi.member
- method도 멤버변수와 같음
day07.modi.protec
- protected 같은 패키지에서 사용가능
but, 상속관계에서 super 키워드르 통한 접근 가능
super();
super.s = "홍길동"
super.method();
오늘 하루
기억에 남는 부분
- this. 은 본인의 멤버변수를 나타내며, 매개변수와 구분을 해줌
- 접근제한자 private로 숨기고 싶은 부분을 가리고, 값이 잘못 입력되는 상황을 줄일 수 있음
private의 범위가 적을수록 좋음 → 범위는 필요할 때 늘리면 됨
어려운 부분
- this()가 어디에서 제대로 쓰이는 건지 헷갈림
- super()를 보통 적으라고는 하는데 기본 생성자가 없을때만 적는거 아닌가..?
문제 해결 부분
- super. super()의 사용 방법 → super.부모의 메서드 중 필요한 부분 이름 적으면 됨
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] interface (0) | 2022.10.14 |
---|---|
[Java] 제어자 (static, final, abstract) (0) | 2022.10.13 |
[Java] overriding(재정의), overloading(중복) (0) | 2022.10.07 |
[Java] Garbage Collecting, package(패키지), 데이터타입, 객체지향 프로그래밍 기술(상속, 은닉, 다형성) (0) | 2022.10.06 |
[Java] object(객체), class(클래스), 변수(멤버/지역), 생성자(constructor) (0) | 2022.10.05 |