today_is

[ 상속 ] 본문

java

[ 상속 ]

ye_rang 2023. 12. 10. 23:31

오늘의 목표 

상속에 대해서 배우고, 상속을 이용하면 어떤 장점이 있는지 

직접 코드를 만들어서 확인해보자 

 



 java 상속시 유의할점 

1) 부모클래스에서 private 필드나 메서드는 상속이 안됨

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

 

 

 

 슈퍼 클래스 vs 서브 클래스 

 

슈퍼클래스

: 부모클래스

 

서브클래스

: 자식클래스. 부모의 속성과 기능을 그대로 물려받음

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

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

 

 

서브클래스 선언

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

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

 

 예시 코드 

 package inheritance;

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) 접근제어자는 부모보다 더 좁은 범위로 변경할 수 없다

 

package inheritance;

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 오버로딩 

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

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

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

 

 


study_review

상속의 의미는 자바를 처음배울때부터 익숙하게 들었던 키워드인데, 

직접 사용해보지 않았을때는 별로 와닿지 않았다.

 

그래서인지 재정의를 하는 이유와 재정의를 통한 이점을 잘 느끼지 못했었다

 

근데 오버라이딩을 통해 내용만 내가 원하는대로 변경해서 사용한다면

클래스를 하나 더 만들 필요없어서 편리한 것 같다

 

오늘은 '재사용'의 편리성을 알게되었다 굿 !!!

 

역시 기초를 탄탄하게 쌓아야 

어떤 지식이든 잘 받아들일 수 있는 듯 하다