[Java] 상속 (extends)

2024. 10. 5. 19:33Java

오늘은 자바의 상속에 대해 알아보고, 상속은 어떠한 장점이 있는지 코드를 작성하며 배워볼거다.

 


 

Java 상속 시 유의할 점

1. 부모 클래스에서 private 필드나 메서드는 상속이 안된다.

2. 다중 상속이 안된다. (인터페이스 에서는 가능)

 

슈퍼 클래스 & 서브 클래스

슈퍼 클래스  = 부모 클래스

 

서브 클래스  = 자식 클래스

부모의 속성과 기능을 그대로 물려받는다.

이미 만들어진 클래스의 재상용을 하기 위함.

즉, 서브클래스는 부모클래스의 내용을 상속받아서 추가적인 요소를 넣어 개념을 확장한다.

 

서브클래스 선언

: extends (확장) 이라는 키워드를 이용함 

-> class 자식클래스명 extends 부모클래스명 

 

예시 코드

class Parent1 {			//	두 정수를 저장할 수 있는 메서드 	==	SuperClass
	int x;
	int y;
	
	void show() {
		System.out.printf("x : %d , y : %d\n", x, y);
	}
	
	void setX(int x) {
		this.x = x;
	}
	
	void setY(int y) {
		this.y = y;
	}
}


//	Parent1 클래스의 속성과 기능을 그대로 물려받는 서브클래스 Child1


class Child1 extends Parent1 {			//	extends

	//	int x;
	//	int y;
		int z;			//	새로운 속성 추가 
		
//	void setX(int x) {this.x = x;}
//	void setY(int y) {this.y = y;}
	void setZ(int z) {this.z = z;}
	
	
	void show() {			//	기존 기능을 수정 (기존에 만들어진 함수와 형식이 일치해야한다)
		System.out.printf("x : %d , y : %d , z : %d\n", x, y, z);
	}
	
	
}


public class Ex01 {
	public static void main(String[] args) {
		Parent1 ob1 = new Parent1();
		ob1.setX(12);
		ob1.setY(7);
		ob1.show();;
		
		
		Child1 ob2 = new Child1();			
		ob2.setX(35);
		ob2.setY(72);
		ob2.setZ(17);		//	ob1 과 다른 형태로 결과 출력된다
		ob2.show();;
	}
}

 


 

오버라이딩 (재정의)

: 부모에게 상속받은 것을 수정해서 사용하는것

 

오버라이딩 사용법 (메서드 위에 Override 어노테이션을 사용해야함)

: @Override 
public String 함수명() 

 

오버라이딩에서 유의할 점

1. 이름이 같아야한다

2. 매개변수 타입이 같아야한다

3. 리턴타입이 같아야한다
4. 내가 재정의하지 않는 것은 그대로 쓸 수 있음 

5. 접근제어자는 부모보다 더 좁은 범위로 변경할 수 없다.

class Student02 {
	String name;
	int score;
	
	public Student02(String name, int score) {
		this.name = name;
		this.score = score;
	}
	
	void show() {
		System.out.printf("이름 : %s, 점수 : %d\n", name, score);
	}
	
	@Override 
	public String toString() {	//	객체를 문자열로 나타낼때의 형식을 정의하는 함수 (= 오버라이딩)
		return String.format("이름 : %s, 점수 : %d\n", name, score);
	}
}

public class Ex09 {
	public static void main(String[] args) {
		Student02 ob = new Student02("이지은", 99);
		ob.show();
		
		System.out.println(ob.toString());
		System.out.println(ob);
		
		//	Student02의 객체도 Object 이다
		Object ob2 = ob;
//		ob2.show();		//	Object 클래스에는 show() 메서드가 없음
		
		System.out.println(ob2.toString());		//	object 클래스에는 toString() 메서드가 있다
		//	오버라이딩을 했기 때문에 오버라이딩 한 내용대로 실행된다 
	
		
		
		
//			Object >> toString()			
//				
//					↓
//				
//			Student >> show()		:  toString을 오버라이딩한 show()
		
		
		
//			Student02 ob1 = new Student02( .. )
//			Object ob2 = new Object ( .. )
		
//			ob1.show()		==	가능
//			ob2.show()		==	불가능 	
	
	}
}

 

오버라이딩 vs 오버로딩

오버로딩은 새로운 메서드를 정의

오버라이딩은 상속받은 부모 메서드의 내용만 변경하는 것

  오버라이딩 오버로딩
메서드명 동일 동일
매개변수, 타입 동일 다름
리턴타입 동일 상관없음

 


 

오버라이딩을 잘 만 사용한다면 굳이 클래스를 더 만들 필요가 없어서 편리한 것 같다.

언제까지나 이걸 잘 활용할 수 있을 만큼 기초가 탄탄하다는 가정하에...

'Java' 카테고리의 다른 글

[Java] StringBuffer  (0) 2024.10.12
[Java] DAO와 DTO (2)  (0) 2024.10.04
[Java] DAO와 DTO (1)  (3) 2024.10.04
[Java] 프로그래머스 문제 풀이에 유용한 String 메서드  (0) 2024.10.04
[Java] Exception  (0) 2024.10.04