Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

오늘은 어제보다 나아지길

[Java] 상속 본문

[Java]

[Java] 상속

그녕쓰 2021. 1. 4. 11:30

상속

현실에서 상속이란 부모가 자식에게 물려주는 행위를 뜻한다.

 

객체 지향 프로그램에서도 상속이란 개념이 존재하는데 부모 클래스의 멤버를 자식 클래스에게 물려주는 행위를 말한다.

 

상속은 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만들기에 코드의 중복을 줄여준다. 

 

클래스 상속

class 자식클래스 extends 부모클래스 {
	// 필드
	// 생성자
	// 메소드
 }

프로그래밍 에선 자식 클래스가 상속을 하기 위해 부모 클래스를 선택한다.

 

자바에서는 다중 상속을 허용하지 않기에 한 개의 부모클래스만을 선택해야 한다.

 

super()

상속에서 super는 두가지 역할을 한다

 

  • 부모 생성자 호출
  • 부모 메소드 호출
// 부모 생성자 호출

public class Phone {

	public String name;
	public String price;
    

	public Phone(name, price) {
		this.name = name;
		this.price = price;
	}
    
	public void Color() {
    
		System.out.println("검정");
	}

}

// 자식 클래스
public CellPhone extends Phone {
	
    public iphone(String name, String price, String ram){

		super(name, price);
		this.ram = ram
	}
    
	super.Color(); // 부모 객체의 Color 메소드 호출
}

public class PhoneExample {
	public static void main(String[] args) {
 
		CellPhone cellPhone = new CellPhone("아이폰", "100만원", "8GB");
		System.out.println("name: " + cellPhone.name); // 부모에게 물려받음
		System.out.println("price: " + cellPhone.price); // 부모에게 물려받음
		System.out.println("ram: " + cellPhone.ram); // 
        
		cellPhone.Color();
		
	}        
}

 

부모 생성자 호출 시 super(매개값) 방식을 사용하며, 매개값의 타입과 일치하는 부모 생성자를 호출한다.

 

super(name, price)는 Phone 생성자인 Phone(name, price)을 호출한다.

 

자식 클래스에서 부모 클래스의 메소드를 오버라이딩 하게 되면, 자식 메소드만 사용

 

메소드 재정의 ( @Override )

 

메소드 오버라이딩이란 상속된 메소드의 내용이 자식 클래스에서 맞지 않을 경우, 자식 클래스에서 동일한 메소드를 재

 

정의 하는 것을 말한다.

 

메소드가 오버라이딩되었다면 부모 객체의 메소드는 숨겨지기 때문에, 자식 객체에서 메소드를 호출하면 오버라이딩된

 

자식 메소드가 호출된다.

 

public class Cal {

	double circle(double r){
    	System.out.println("Cal의 circle 실행");
        return 3.141592 * r * r;
    }
}

public class Computer extends Cal {

	@Override
	double circle(double r) {
    	System.out.println("Computer의 circle 실행");
        return Math.PI * r * r;
    }
}

public class Example {
	public static void main(String[] args) {
    
    	int r = 10;
        
        Cal cal = new Cal();
        System.out.println("면적: " + cal.circle(r)); // 부모 메소드 호출
        
        Computer com = new Computer();
        System.out.println("면적: " + com.circle(r)); // 자식 메소드 호출
        
   }
}
        

 

final

 

클래스와 메소드 앞에 final 키워드를 붙이면 상속과 오버라이딩이 불가능한 상태로 만들수 있다.

 

public final class ABC{ // 상속 불가능한 클래스

	public final void DEF() { // 오버라이딩 불가능한 메소드
    
    }
}

 

protected 접근 제한자

 

protected는 public과 default 접근 제한의 중간쯤에 해당한다.

 

같은 패키지에서는 default 처럼 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.

 

protected는 필드, 생성자, 메소드 선언에 사용될 수 있다.

 

추상 클래스

 

사전적 의미로 추상(abstract)은 실체 간에 공통되는 특성을 추출한 것을 말한다.

 

클래스들의 공통적인 특성을 추출해서 선언한 클래스 ==> 추상 클래스

 

객체를 직접 생성할 수 있는 클래스 ==> 실체 클래스

 

추상 클래스가 부모이며 실체 클래스는 자식으로 구현되어 실체 클래스는 추상클래스의 모든 특성을 물려 받고,

 

추가적인 특성을 가질 수 있다.

 

추상 클래스는 공통되는 필드와 메소드를 쓰기 위해 만들어 졌기에 객체를 직접 생성 할 수 없다.

 

즉, new 연산자를 사용해서 인스턴스를 생성시키지 못하기에 부모 클래스로만 사용된다.

( 즉, extends를 통해서 사용 가능 ) 

 

 

추상 클래스의 용도

 

  • 실체 클래스들의 공통된 필드와 메소드의 이름을 통일할 목적
  • 실체 클래스를 작성할 때 시간을 절약

 

추상클래스 선언 

public abstract class Phone {
	
	// 필드
	public String owner;

	// 생성자
	public Phone(String owner) {
		this.owner = owner;
	}
    
	// 메소드
	public void turnOn() {
		System.out.println("전원을 킵니다.");
	}
    
	public void turnOff(){
		System.out.println("전원을 킵니다.");
	}
}

public class SmartPhone extends Phone {

	// 생성자
	public SmartPhone(String owner) {
		super(owner)
	}
    
	// 메소드
	public void internetSearch() {
		System.out.println("인터넷을 검색합니다.");
	}
}


public class PhoneExample {
	public static void main(String[] args) {
    
	SmartPhone smartPhone = new SmartPhone("홍길동");
    
	smartPhone.turnOn(); // 전원을 킵니다.
	smartPhone.internetSearch(); // 인터넷을 검색합니다.
	smartPhone.turnOff(); // 전원을 끕니다.
	
    }
}

 

추상 클래스를 설계할 때, 하위 클래스가 반드시 메소드를 실행하여야 할 경우, 해당 메소드를 추상 메소드로 선언하면 된다. 자식 클래스는 반드시 추상 메소드를 오버라이딩해서 사용하여야 하기 때문이다.

 

public abstract class Animal{ 

	public String kind;
    
	public void breathe() {
		System.out.println("숨을 쉽니다.");
	}
    
	public abstract void sound(); // 추상 메소드 선언
    
}

public class Dog extends Animal {

	public Dog() {
		this.kind = "포유류";
 	}
    
	@Override
	public void sound() {
		System.out.pritln("멍멍");
	}
}

public class AnimalExample {
	public static void main(String[] args) {
    
	Dog dog = new Dog();
    
	dog.sound(); // 멍멍
	
    }
}

'[Java]' 카테고리의 다른 글

[Java] 컬렉션 프레임워크  (0) 2020.12.15
[Java] 클래스 정리  (0) 2020.11.16
[Java] 자바 다시 시작하기  (0) 2020.11.12
Comments