자바의 상속
1) 상속이란?
부모클래스의 필드와 메소드를 자식 클래스에게 물려주는 것
-> 중복되는 코드를 줄여 개발 시간 단축
-> 다중 상속 허용하지 않음
2) 상속 방법
public class 부모 클래스명 { } //부모 클래스
public class 자식 클래스명 extends 부모클래스명 { } //자식 클래스
ex)
class Phone {
public String model;
public String color;
public void bell() { System.out.println("벨이 울립니다"); }
public void hangup() { System.out.println("전화를 끊습니다"); }
}
class SmartPhone extends Phone {
public boolean wifi;
public SmartPhone(String model , String color)
{
this.model = modle; //Phone으로부터 상속받은 필드
this.color =color;
}
public void setWifi(boolean wifi) {
this.wifi = wifi;
System.out.println("와이파이 상태를 변경했습니다"); }
}
public class SmartPhoneExam {
public static void main(String [] args) {
SmartPhone a = new SmartPhone("갤럭시" , "은색");
System.out.println("모델 : "+ a.model);
System.out.println("색 : "+a.color);
System.out.println("와이파이 상태 : "+a.setWifi);
a.bell();
a.hangup();
a.setWifi(true);
}
}
super 키워드
부모 클래스로부터 상속 받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수
-> 인스턴스 변수의 이름과 지역 변수 이름이 같은 경우 인스턴스 변수 앞에 this를 붙인 것처럼 부모클래스와 자식 클래스 사이에서도 멤버 이름이 같을 경우 super 키워드로 구분
ex)
class Parent {
int a;
Parent (int n ) { a= n; }
}
class Child extends Parent {
int b;
Child() {
super();
b = 20;
}
}
메소드 오버라이딩
1) 오버라이딩이란?
상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니처를 갖는 메소드로 다시 정의하는 것
-> 자식 클래스는 부모 클래스의 private 멤버를 제외한 모든 메소드 상속 받음
2) 오버라이딩 조건
a. 메소드의 선언부는 기존 메소드와 완전히 같아야 함 하지만 메소드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환 할 수 있는 타입이라면 변경할 수 있음
b. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경 불가능
c. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없음
ex)
class Parent{
void display() { System.out.println("부모 display() 메소드"); }
class Child extends Parent {
void display() { System.out.println("자식 display() 메소드"); }
public class test {
public static void main(String[] args) {
Parent pa = new Parent();
pa.display(); // 부모의 display() 메소드 호출
Child ch = new Child();
ch.display(); //자식의 display() 메소드 호출
Parent pc = new Child();
pc.display(); //자식의 display() 메소드 호출
}
}
다이나믹 메소드 디스패치 (Dynamic Method Dispatch)
1) static dispatch
컴파일 시점에서 컴파일러가 특정 메소드를 호출할 것이라고 명확하게 알고 있는 경우
class Person {
public void print() {
System.out.println("홍길동");
}
}
class Jung extends Person {
public void print() {
System.out.println("정길동");
}
}
public class Main {
public static void main(String[] args) {
Person a = new Jung();
System.out.println(Jung.print());
}
}
2) dynamic dispatch
컴파일러가 어떤 메소드를 호출하는지 모르는 경우
-> 호출할 메소드를 런타임 시점에서 결정
인터페이스나 추상 클래스에 정의된 추상 메소드를 호출하는 경우
Interface Car {
void print();
}
class A implements Car {
@Override
public void print() {
System.out.println("a");
}
}
class B implements Car {
@Override
public void print() {
System.out.println("b");
}
}
public class Main {
public static void main(String [] args) {
Car car = new A();
System.out.println(car.print());
}
}
추상 클래스
1) 추상 클래스란?
하나 이상의 추상 메소드를 포함하는 클래스
-> 다형성을 가지는 메소드의 집합을 정의할 수 있음
-> 이 클래스를 상속 받는 모든 클래스에서는 이 추상 메소드 반드시 정의해야 함
2) 선언 방법
//추상 클래스
abstract class 클래스 이름 { }
//추상 메소드
abstract 반환타입 메소드 이름();
ex)
abstract class My { // 추상 메소드가 있든 없든 객체를 생성하지 않겠다는 의미임 , new My()
public void prn() {
System.out.println("나 추상의 멤버얌 My's Prn ");
}
public abstract void disp(); // 추상 메소드, { }가 없는 선언만 되어 있는 추상 메소드
}
class myTest extends My {
@Override
public void disp() {
System.out.println(" 그래 난 강제로 정의한 myTest's disp");
}
}
public class AbsTest {
public static void main(String[] args) {
// My m=new My(); -> 추상 클래스는 new 객체 생성 불가능
myTest m = new myTest(); // My() , myTest()
m.prn();
m.disp();
My res = new myTest(); // My() , myTest()
res.disp();
res.prn();
}
}
final 키워드
1) 변수에서의 final 키워드
수정할 수 없다는 의미 -> 따라서 초기값은 필수적
다른 객체를 참조하거나 할 때 참조하는 객체 내부의 값은 변경 가능
final int value = 100;
2) 메소드에서의 final 키워드
override를 제한함 -> 상속 받은 클래스에서 해당 메소드를 수정해서 사용하지 못하도록 함
3) 클래스에서의 final 키워드
상속 불가능 클래스가 됨 -> 다른 클래스에서 상속하여 재정의 불가능
public final class Integer extends Number implements Comparable <Integer> { }
Object 클래스
java.lang 패키지
자바에서 가장 기본적인 동작을 수행하는 클래스들의 집합
이 안에 여러 메소드 들이 있는데 그 중 java.lang.Object 클래스를 볼 수 있음
-> Object 클래스 : 모든 자바 클래스의 최고 조상 클래스
따라서 자바의 모든 클래스는 Object 클래스의 모든 메소드를 바로 사용 가능
https://docs.oracle.com/javase/8/docs/api/index.html
Java Platform SE 8
docs.oracle.com
이 링크는 java.lang.Object의 메소드들을 살펴볼 수 있음
'🦁아기사자' 카테고리의 다른 글
[Java] Enum (0) | 2025.03.26 |
---|---|
[Java] 멀티스레드 프로그래밍 (0) | 2025.03.25 |
[Java] 인터페이스 (0) | 2025.03.20 |
[Java] 패키지 (0) | 2025.03.19 |
[Java] 클래스 (class) (0) | 2025.03.18 |