[TIL#5] Java 문법 종합반 3주차(2)

Jiwoo·2024년 4월 25일
0

내일배움캠프

목록 보기
9/65
post-thumbnail
post-custom-banner

학습 내용


접근 제어자

📌 접근 제어자

: 폴더 상에서 어디까지 접근을 허용할 것이냐

  • public: 접근 제한 X

  • protected: 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근 가능

  • default: 같은 패키지 내에서만 접근 가능

  • private: 같은 클래스 내에서만 접근 가능

📌 Getter

private 필드를 어떻게 읽어오거나 저장할까??

  • 외부에서 객체의 private 한 필드 읽을 필요 있을 때 사용
    -> 내보내야 하는 정보만 간추려서 내보내기 가능!
public String getModel() {
    return model;
}

public String getColor() {
    return color;
}

public double getPrice() {
    return price;
}

📌 Setter

  • 외부에서 객체의 private 한 필드를 저장,수정할 필요 있을 때 사용
public void setModel(String model) {
    this.model = model;
}

public void setColor(String color) {
    this.color = color;
}

public void setPrice(double price) {
    this.price = price;
}

상속

상속 -> 오버라이딩

public class 자식클래스 extends 부모클래스 {

}


1. 부모 클래스에서 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용 가능
2. 자식 클래스에 새로운 필드와 메서드가 추가되어서 부모 클래스는 영향 X
3. 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

📌 단일 상속과 다중 상속

java는 다중상속 불가!

📌 final

부모 클래스 final로 선언해놓으면 자식 못바꿈

public class Car {
    public final void horn() {
        System.out.println("빵빵");
    }
}

...

public class SportsCar extends Car{
    public void horn() { // 오류 발생!
        super.horn();
    }
}

오버라이딩

부모 클래스로부터 상속 받은 메서드를 자식 클래스에서 재정의

  • 부모 클래스 메서드 그대로 사용 가능하지만 자식 클래스에서 상황에 맞게 변경해야 할 때
  • 조건
    1. 선언부가 부모 클래스의 메서드와 일치
    2. 접근 제어자를 부모 클래스의 메서드보다 좁은 범위로 변경 X
    3. 예외는 부모 클래스 메서드보다 많이 선언 X

📌 super

부모 클래스의 멤버를 참조할 수 있는 키워드

public void setCarInfo(String model, String color, double price) {
    super.model = model; // model은 부모 필드에 set
    super.color = color; // color는 부모 필드에 set
    this.price = price; // price는 자식 필드에 set
}
  • 자식 클래스의 메서드 호출하면 super 키워드로 접근한 부모 클래스의 model, color 필드에 매개변수 값 저장
  • this 키워드로 접근한 자식 클래스의 price 필드에는 매개변수 값 저장

📌 super()

부모 클래스의 생성자를 호출할 수 있는 키워드

// 부모 클래스 Car 생성자
public Car(String model, String color, double price) {
    this.model = model;
    this.color = color;
    this.price = price;
}
// 자식 클래스 SportsCar 생성자
public SportsCar(String model, String color, double price, String engine) {
     // this.engine = engine; // 오류 발생
    super(model, color, price);
    this.engine = engine;
}

다형성

📌 자동 타입 변환

부모 타입 변수 = 자식 타입 객체;

-> 자동으로 부모 타입으로 변환 일어남

  • 주의할 점: 부모 타입 변수로 자식 객체의 멤버에 접근할 때는 상속받은 멤버만 접근 가능

📌 강제 타입 변환

자식 타입 변수 = (자식 타입) 부모 타입 객체;

  • 부모 타입 객체는 자식 타입 변수로 자동 타입 변환 X
  • (자식 타입) <- 타입 변환 연산자 사용해 강제로 변환
// 자식타입객체가 자동 타입변환된 부모타입의 변수
Mammal mammal = new Whale();
mammal.feeding();

// 자식객체 고래의 수영 기능을 사용하고 싶다면
// 다시 자식타입으로 강제 타입변환을 하면된다.
Whale whale = (Whale) mammal;
whale.swimming();
  • 자식 타입 객체가 부모 타입으로 자동 타입 변환된 후 다시 자식 타입으로 변환될 때만 강제 타입 변환 가능

📌 다형성

여러 가지 형태를 가질 수 있는 능력

부모 타이어 변수 = 자식 타이어 객체;

-> 각각의 자식 타이어 객체에 재정의 된 메서드를 통해 다양한 승차감을 가진 자동차 생성

Tire tire = new HankookTire("HANKOOK");
Tire tire = new KiaTire("KIA");
public Car(Tire tire) {
    this.tire = tire;
}

...

Car car1 = new Car(new KiaTire("KIA"));
Car car2 = new Car(new HankookTire("HANKOOK"));

추상 클래스

부모는 완성시키지 않은 method -> 자식이 상속받아서 완성

  • abstract 키워드
public abstract class 추상클래스명 {

}

📌 추상 클래스 상속

public class 클래스명 extends 추상클래스명 {
    @Override
    public 리턴타입 메서드이름(매개변수, ...) {
		   // 실행문
    }
}

상속받은 클래스에서 추상클래스의 추상메서드는 반드시 오버라이딩 되어야 한다!


인터페이스

두 객체를 연결해 주는 다리 역할

📌 인터페이스 선언

public interface 인터페이스명 { 

}

📌 인터페이스의 멤버

  • 모든 멤버 변수는 public static final (생략 가능)
  • 모든 메서드는 public abstract (생략 가능)
  • 생략되는 제어자는 컴파일러가 자동으로 추가
public interface 인터페이스명 { 
		public static final char A = 'A';
    static char B = 'B';
    final char C = 'C';
    char D = 'D';

    void turnOn(); // public abstract void turnOn();
}

📌 인터페이스 구현

  • implements 키워드 사용
public class 클래스명 implements 인터페이스명 { 
			// 추상 메서드 오버라이딩
			@Override
	    public 리턴타입 메서드이름(매개변수, ...) {
			       // 실행문
	    }
}
  • 인터페이스의 추상 메서드는 반드시 오버라이딩 돼야 함!

📌 인터페이스 상속

  • extends 키워드 사용
  • 클래스와는 다르게 다중 상속 가능
public class Main implements C {

    @Override
    public void a() {
        System.out.println("A");
    }

    @Override
    public void b() {
				System.out.println("B");
    }
}

interface A {
    void a();
}
interface B {
    void b();
}
interface C extends A, B { }
  • 인터페이스 C는 아무것도 선언되어 있지 않지만 인터페이스 A, B를 다중 상속받음 -> 추상 메서드 a, b 가지고 있는 상태
  • Main 클래스에서 인터페이스 C 구현될 때 a, b 추상 메서드 오버라이딩 됨

디폴트 메서드와 static 메서드

📌 디폴트 메서드

  • 추상 메서드의 기본적인 구현 제공
  • 추상 메서드가 아니기에 인터페이스 구현체들에서 필수로 재정의 X
public class Main implements A {

    @Override
    public void a() {
        System.out.println("A");
    }


    public static void main(String[] args) {
        Main main = new Main();
        main.a();

        // 디폴트 메서드 재정의 없이 바로 사용가능합니다.
        main.aa();
    }
}

interface A {
    void a();
    default void aa() {
        System.out.println("AA");
    }
}

📌 static 메서드

  • static 특성 그래도 인터페이스의 static 메서드 또한 객체 없이 호출 가능
  • 접근 제어자 생략 시 컴파일러가 public 추가
public class Main implements A {

    @Override
    public void a() {
        System.out.println("A");
    }

    public static void main(String[] args) {
        Main main = new Main();
        main.a();
        main.aa();
        System.out.println();

        // static 메서드 aaa() 호출
        A.aaa();
    }
}

interface A {
    void a();
    default void aa() {
        System.out.println("AA");
    }
    static void aaa() {
        System.out.println("static method");
    }
}

다형성

📌 자동 타입 변환

인터페이스 변수 = 구현객체;

public class Main {
    public static void main(String[] args) {
        
        // A 인터페이스에 구현체 B 대입
        A a1 = new B();
        
        // A 인터페이스에 구편체 B를 상속받은 C 대입
        A a2 = new C();
        
    }
}

interface A { }
class B implements A {}
class C extends B {}

📌 강제 타입 변환

구현 객체 타입 변수 = (구현 객체 타입) 인터페이스 변수;

📌 인터페이스의 다형성

// LG TV 구현체를 조작
MultiRemoteController mrc = new LgTv("LG");
mrc.turnOnOff();
mrc.volumeUp();

// 조작 대상을 Samsung TV로 교체
mrc = new SamsungTv("Samsung");
mrc.turnOnOff();
mrc.channelUp();
  • 자동 타입 변환된 인터페이스 변수 사용해 TV 구현 객체의 기능 조작
  • TV 구현 객체 교체해도 멀티리모컨 인터페이스 변수는 그대로 기능 호출
  • 사용 방법은 동일하지만 다양한 특징과 결과를 가질 수 있음

회고

난이도가 갑자기 확 뛴 느낌이랄까...
여유롭게 들을려고 했는데 갑자기 진도가 막혔다.
솔직히 완벽하게 이해했다고 못하겠다.
직접 코드 짜보고 응용하면서 개념을 익혀야겠다.

post-custom-banner

0개의 댓글