TIL

TIL 241016

muerha 2024. 10. 16. 22:02

 

 

Java 문법 종합반

 


 

 

상속

부모 클래스의 필드와 메서드를 자식 클래스에게 물려줄 수 있다!

코드 중복 제거, 재사용성 증가 ▶ 생산성과 유지보수성에 매우 유리하다.

 

클래스간의 상속은 extends 키워드를 사용하여 정의

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

}

 

상속은 확장의 개념이다.

 

  • 부모 클래스에 새로운 필드와 메서드가 추가되면 자식 클래스는 이를 상속받아 사용할 수 있다.
  • 자식 클래스에 새로운 필드와 메서드가 추가되어도 부모 클래스는 어떠한 영향도 받지 않는다.
  • 따라서 자식 클래스의 멤버 개수는 부모 클래스보다 항상 같거나 많다.

 

상속관계 is
포함관계 has

 

자바는 다중상속을 허용하지 않는다.

▶ 자식 클래스에서 상속받는 서로 다른 부모 클래스들이 같은 이름의 멤버를 가지고 있다면 클래스간의 관계가 복잡해지는 문제가 생기기 때문

 

 

 

final 클래스와 final 메서드

 

부모 클래스에 final 키워드를 지정하여 선언하면 최종적인 클래스가 되기 때문에 더 이상 상속할 수 없는 클래스가 된다.

 

 

 

Object

객체를 의미하는 단어이며 보통 Object 클래스를 의미한다.

Object 클래스는 Java 내 모든 클래스들의 최상위 부모 클래스이기 때문에 모든 클래스는 Object의 메서드를 사용할 수 있다.

 

 

 

 오버라이딩 

부모 클래스로부터 상속받은 메서드의 내용을 재정의 하는 것

 

오버라이딩을 하기 위한 조건

  • 선언부가 부모 클래스의 메서드와 일치해야 한다.
  • 접근 제어자를 부모 클래스의 메서드 보다 좁은 범위로 변경할 수 없다.
  • 예외는 부모 클래스의 메서드 보다 많이 선언할 수 없다.

 

 

super 와 super()

 

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

객체 내부 생성자 및 메서드에서 부모 클래스의 멤버에 접근하기 위해 사용

 

// 부모 클래스 Car
String model; // 자동차 모델
String color; // 자동차 색상
double price; // 자동차 가격
// 자식 클래스 SportsCar
String model = "Ferrari"; // 자동차 모델
String color = "Red"; // 자동차 색상
double price = 300000000; // 자동차 가격
public void setCarInfo(String model, String color, double price) {
	super.model = model; // model은 부모 필드에 set
	super.color = color; // color는 부모 필드에 set
	this.price = price; // price는 자식 필드에 set
}

 

 

 

다형성

부모타입 변수 = 자식타입객체; 는 자동으로 부모타입으로 변환이 일어난다.

 

 

참조변수의 타입변환

 

■ 자동 타입변환

 

Mammal : 부모 클래스

class Mammal {
	// 포유류는 새끼를 낳고 모유수유를 한다.
	public void feeding() {
		System.out.println("모유수유를 합니다.");
	}
}

 

Whale : 자식 클래스

class Whale extends Mammal {
	// 고래는 포유류 이면서 바다에 살며 수영이 가능하다.
	public void swimming() {
		System.out.println("수영하다.");
	}
	@Override
	public void feeding() {
		System.out.println("고래는 모유수유를 합니다.");
	}
}

 

메인클래스

public class Main {
	public static void main(String[] args) {
		// 고래는 포유류이기 때문에 포유류 타입으로 변환될 수 있다.
		Mammal mammal = new Whale();
        
		// 하지만 포유류 전부가 바다에 살고 수영을 할 수 있는 것은 아니기 때문에
		// 수영 하다 메서드는 실행 불가
		// 즉, 부모 클래스에 swimming이 선언되어있지 않아서 사용 불가능하다.
		// mammal.swimming(); // 오류 발생
        
		// 반대로 모든 포유류가 전부 고래 처럼 수영이 가능한 것이 아니기 때문에 타입변환이 불가능하다.
		// 즉, 부모타입의 객체는 자식타입의 변수로 변환될 수 없다.
		// Whale whale = new Mammal(); // 오류 발생
        
		mammal.feeding();
	}
}

 

 

■ 강제 타입변환

 

부모타입객체는 자식타입 변수로 자동으로 타입변환되지 않는다.

자식타입객체가 부모타입으로 자동 타입변환된 후 다시 자식타입으로 변환될 때만 강제 타입변환이 가능하다.

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

 

 

 

instanceof

 

객체가 내가 의도하는 클래스의 객체인지 확인할 수 있다.

{대상 객체} instance of {클래스 이름} 와 같은 형태로 사용

응답값은 boolean

// 다형성
class Parent { }
class Child extends Parent { }
class Brother extends Parent { }

public class Main {
	public static void main(String[] args) {
    
		Parent p = new Parent();
        
		System.out.println(p instanceof Object); // true 출력
		System.out.println(p instanceof Parent); // true 출력
		System.out.println(p instanceof Child); // false 출력
        
		Parent c = new Child();
        
		System.out.println(c instanceof Object); // true 출력
		System.out.println(c instanceof Parent); // true 출력
		System.out.println(c instanceof Child); // true 출력
	}
}

 

 

 

추상 클래스

미완성된 설계도

abstract 키워드를 사용하여 추상 클래스를 선언

public abstract class 추상클래스명 {

}

 

  • 추상 클래스는 추상 메서드를 포함할 수 있다.(추상 메서드가 없어도 추상 클래스로 선언할 수는 있음)
  • 추상 클래스는 자식 클래스에 상속되어 자식 클래스에 의해서만 완성될 수 있다.
  • 추상 클래스는 여러개의 자식 클래스들에서 공통적인 필드나 메서드를 추출해서 만들 수 있다.

 

추상 메서드는 extends 키워드를 사용하여 클래스에서 상속된다.

public abstract class 추상클래스명 {
	abstract 리턴타입 메서드이름(매개변수, ...);
}

 

추상 메서드는 일반적인 메서드와는 다르게 블록{ }이 없다. 즉, 정의만 할 뿐, 실행 내용은 가지고 있지 않다.

 

 

extends 키워드를 사용하여 클래스에서 상속

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

 

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

 

 

 

인터페이스

 

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

상속 관계가 없는 다른 클래스들이 서로 동일한 행위(메서드)를 구현해야할 때 인터페이스는 구현 클래스들의 동일
한 사용 방법과 행위를 보장해 줄 수 있다.

 

interface 키워드를 사용하여 인터페이스를 선언

public interface 인터페이스명 {

}

 

 

인터페이스의 모든 멤버변수는 public static final 이어야 한다. 생략 가능.

모든 메서드는 public abstract 이어야 한다. 생략 가능. (static 메서드와 default 메서드 예외 이건 나중에 생각)

생략되는 제어자는 컴파일러가 자동으로 추가해줌

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 리턴타입 메서드이름(매개변수, ...) {
		// 실행문
	}
}

 

  • 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 한다.
  • 만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경해주면 된다.

 

인터페이스간의 상속은 implements 가 아니라 extends 키워드를 사용

인터페이스는 클래스와는 다르게 다중 상속이 가능하다.

'TIL' 카테고리의 다른 글

TIL 241018  (0) 2024.10.18
TIL 241017  (0) 2024.10.17
TIL 241015  (2) 2024.10.15
TIL 241014  (0) 2024.10.14
TIL 241011  (0) 2024.10.11