원지의 개발
article thumbnail
728x90

this

  • 자기 자신(=나의 주소) 객체를 지정할 때 사용하는 키워드
// 키워드
this. 동일 클래스 내의 멤버(멤버변수, 메서드)를 참조
this() 생성자 내부에서 자신의 다른 생성자를 호출

같은 이름의 매개변수가 멤버변수가 됨

 

원래 이름이 같으면 가장 가까운 위치의 이름을 인식하므로

매개변수의 이름과 멤버변수의 이름을 다르게 지정했었으나

 

this. 입력하면 매개변수가 나의 멤버변수에 입력이 됨

 

→ 결과적으로 매개변수, 멤버변수

    구분 가능

 

 

this( ) - 생성자 연결, 100줄짜리 코드 같은거 있을 때

Person-MainClass - this. & this()

this

  • Person p
    1. 멤버변수: name, age
    2. 생성자 설정: this()는 나의 생성자에 접근이 가능하게 함
    3. this("홍길동", 1); 이면 이름: 홍길동, 나이:1인 생성자가 설정되었으므로 main에서 p.info() 출력
  • Person p1
    1. 멤버변수: name, age
    2. 생성자 설정: 매개변수 name이 있고, this()로 생성자의 name에 접근 가능하게 하고, 나이:1로 설정
    3. p1에서 매개변수 name 입력하고 p1.info() 출력
  • Person p2
    1. 멤버변수: name, age
    2. 생성자 설정: 매개변수 name, age가 있고,
      this. 이용하여 매개변수 name -> 멤버변수 name에 저장+ toUpperCase(): 대문자 만들기
      / 매개변수 age -> 멤버변수 age에 저장
    3. p2에서 매개변수 name, age 입력하고 p2.info() 출력
  • Teacher t 는 다른 파일에 있음

Car-MainClass - this. & 메서드 안에서 메서드 호출

this2

  • model 전달받아서(= 매개변수로 입력 받는다) model에 저장하는 생성자 생성 -> this. 사용
  • (멤버변수 speed는 전달 받지 않으면 알아서 자동 초기화 = 0 됨)
  • accel 메서드 생성
    1. 멤버변수 speed가 150이니까 this.speed 사용
    2. 매개변수를 멤버변수에 저장해야 하니까 매개변수 speed가 오른쪽, 멤버변수 this.speed가 왼쪽!
  • run 메서드 생성
    1. 메서드 안에서 메서드를 입력받으려면 이름만 불러도 됨 ex) accel();
    2. 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.부모의 메서드 중 필요한 부분 이름 적으면 됨

 

728x90
profile

원지의 개발

@원지다

250x250