🦁아기사자

[Java] 상속

코딩하는 하마 2025. 3. 18. 23:43

자바의 상속

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