본문 바로가기

국비과정/JAVA

20230620 _[13일차]_02. 접근제어자_ 상속 *

 

나 <--> 부모님

상속

자바에서 클래스의 상속은 아래와 같은 장점이 있습니다.

1. 기존에 작성된 클래스를 재활용할 수 있습니다.

2. 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성해 놓으면,

자식 클래스에서는 해당 멤버를 작성하지 않아도 됩니다.

3. 클래스 간의 계층적 관계를 구성함으로써 다형성의 문법적 토대를 마련합니다.

 

class 자식클래스이름 extend 부모클래스이름 { ... }

 

자바에서 클래스는 단 한 개의 클래스만을 상속받는 단일 상속만이 가능합니다.

 

========================================================

자바의 모든 클래스는 Object의 하위 클래스입니다.

 


[ 상속 ] _ 단일상속 (자식들은 부모 하나만 가질 수 있음)  <-->  다중상속

package jun20;


class Animal {	// 부모 클래스, 상위 타입, 슈퍼 타입 
	String name;
	int age;
	
	public void sount() {		// 자식클래스의 속성들이 겹친다면 부모 클래스에 넣어줌
		System.out.println("자식마다 소리가 달라요");
	}
}

class Dog extends Animal {	// 자식 클래스1, 하위 클래스, 서브 타입
	int number; 
	
}

class Cat extends Animal {	// 자식클래스2
	
}


public class inheritance {
	public static void main(String[] args) {

		Dog dog = new Dog();	
		Cat cat = new Cat();	// 객체생성하면 
        
		dog.name = "poppy";		// 부모가 가진것들 사용가능
		cat.age = 3;
		
		Animal a = new Animal();	// 부모 객체 생성하면 자식이 가진건 사용못함..
//		a.number = 2;		// 불가능
		
	}
}

 

[ 오버라이드 ] _  자식요소마다 다른 기능을 실행시키고 싶다면!?!?

package jun20;

class Animal {
	String name;
	int age;
	
	public void sount() {
		System.out.println("자식마다 소리가 달라요");
	}
}

// 부모에 정의된 메소드를 재정의해서 사용해보겠습니다.
// 어노테이션 --> 정보표시
class Dog extends Animal {
	int number; 
	
	@Override
	public void sount() {
		System.out.println("BOWOW");
	}
}

class Cat extends Animal {
	
	@Override
	public void sount() {
		System.out.println("Mew~ Mew~");
	}
	
}


public class inheritance {
	public static void main(String[] args) {

		Dog dog = new Dog();
		Cat cat = new Cat();

		dog.sount();	// BOWOW
		cat.sount();	// Mew~ Mew~
			
	}
}

		Dog dog = new Cat();	// 불가능!!
        // 둘은 같은 부모를 가진 자식일 뿐 묶여있지 않은 별개의 클래스
		
        // 연관관계는 가능
		Object obj = new String();
		Number n = new Integer(10);

[ 상속 및 연관 클래스 생성 ]

 

부모 > 자식

class Animal 

    > class Dog

    > class Cat

         > class KorShort

    > class Human

         > class Asia

                > class Korean

                        > class MZ

 

위의 관계에서 Human, Asia, Korean, MZ  는 연관관계. 오버라이드 가능.

 

package jun20;


class Animal {
	String name;
	int age;
	
	public void sound() {
		System.out.println("자식마다 소리가 달라요");
	}
}

// 부모에 정의된 메소드를 재정의해서 사용해보겠습니다.
// 어노테이션 --> 정보표시
class Dog extends Animal {
	int number; 
	
	@Override
	public void sound() {
		System.out.println("BOWOW");
	}
}

class Cat extends Animal {
	
	@Override
	public void sound() {
		System.out.println("Mew~ Mew~");
	}
	
}


public class inheritance {
	public static void main(String[] args) {

		Dog dog = new Dog();
		Cat cat = new Cat();

		dog.sound();	// BOWOW
		cat.sound();	// Mew~ Mew~
		
		KorShort korShort = new KorShort();
		korShort.sound();	// Mew~ Mew~ (부모인 Cat의 속성 따름)
		
		Korean k = new Korean();
		k.sound();	// 살려줘
		
	}

}

class Human extends Animal {
	
}

class Asia extends Human {
	String rice;
}

class Korean extends Asia {
	String ssn;
	
	void myInfo( ) {
		System.out.println("이름은 " + name + "입니다.");
		System.out.println("나이는 " + age + "살 입니다.");
		System.out.println( "주민번호는 " + ssn + "입니다.");
	}
	
	@Override
	public void sound() {
		System.out.println("살려줘");
	}

}

class KorShort extends Cat {
	// 고양이의 (부모가 가진) 이름&나이 속성 가지고 있음
}

 class MZ 추가

 

 

package jun20;


class Animal {
	String name;
	int age;
	
	public void sound() {
		System.out.println("자식마다 소리가 달라요");
	}
}

// 부모에 정의된 메소드를 재정의해서 사용해보겠습니다.
// 어노테이션 --> 정보표시
class Dog extends Animal {
	int number; 
	
	@Override
	public void sound() {
		System.out.println("BOWOW");
	}
}

class Cat extends Animal {
	
	@Override
	public void sound() {
		System.out.println("Mew~ Mew~");
	}
	
}


public class inheritance {
	public static void main(String[] args) {

		Dog dog = new Dog();
		Cat cat = new Cat();

		dog.sound();
		cat.sound();
		
		KorShort korShort = new KorShort();
		korShort.sound();
		
		Korean k = new Korean();
		k.sound();
		
		MZ mz = new MZ();
		mz.ssn = "950228-1234567";
		mz.myInfo();
		
	}

}

class Human extends Animal {
	
}
class Asia extends Human {
	String rice;
}
class Korean extends Asia {
	String ssn;
	
	void myInfo( ) {
		System.out.println("이름은 " + name + "입니다.");
		System.out.println("나이는 " + age + "살 입니다.");
		System.out.println( "주민번호는 " + ssn + "입니다.");
	}
	
	@Override
	public void sound() {
		System.out.println("살려줘");
	}

}

class KorShort extends Cat {
	
}

class MZ extends Korean {
	String name = "pyo";
	int age = 0;
			
	@Override
	void myInfo() {	// 950228 - *******
		System.out.println("이름은 " + name + "입니다.");
		System.out.println("나이는 " + age + "살 입니다.");
		System.out.println( "주민번호는 " + ssn.substring(0, 8) + "*******입니다.");
	}
}​

BOWOW
Mew~ Mew~
Mew~ Mew~
살려줘
이름은 pyo입니다.
나이는 0살 입니다.
주민번호는 950228-1*******입니다.

 

[ 오버라이드 ] _ 상속, 메소드 재정의

부모의 메소드를 자식 클래스에서 재정의 해서 사용하는 것

부모의 일부 메소드를 다시 수정해서 사용하기

 

규칙 :

1. 부모의 메소드와 동일한 시그니처(리턴타입, 메소드명, 매개변수)를 가지고 있어야 합니다.

다르면 다른 메소드

2. 접근제한을 더 강하게 할 수 없습니다. 동일하게 설정합니다.  혹은 더 넓게 지정합니다.

3. 새로운 예외를 Throw 할 수 없습니다.

 

오버라이드 했다면 메소드 상단에 @Override 라고 표시됩니다.

자식 메소드에서 재정의 했다면 부모의 메소드는 은닉됩니다.

은닉된 부모의 객체를 호출할 때는 super로 호출합니다.


[ 오버로드 ] _ 매개변수, 같은 이름, 다른 호출

 

하나의 클래스 속에 같은 이름의 메소드를 여러개 만드는 것

메소드 시그니처 (수, 순서, 타입)이 일치하지 않으면 됩니다.

호출할 때는 시그니처에 맞는 메소드가 일을 합니다.

접근제어자, 리턴타입은 보지 않습니다. 오로지 파라미터만.

 

[ 관련 설명 ]

http://www.tcpschool.com/java/java_inheritance_concept

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


oArr 이라는 Animal 배열을 만들어서 

자식요소 생성자들을 순서대로 배열요소로 입력 -> Dog, Cat, Human

oArr 배열을 for문으로 출력!!

package jun20;


class Animal {		// 부모클래스
	String name;
	int age;
	
	public void sound() {
		System.out.println("자식마다 소리가 달라요");
	}
}

class Dog extends Animal {	// 자식클래스
	int number; 
	
	@Override
	public void sound() {
		System.out.println("BOWOW");
	}
}

class Cat extends Animal {	 // 자식클래스
	
	@Override
	public void sound() {
		System.out.println("Mew~ Mew~");
	}
	
}


public class inheritance {
	public static void main(String[] args) {

		Animal[] oArr = new Animal[3];
		oArr[0] = new Dog();
		oArr[1] = new Cat();
		oArr[2] = new Human();
		
		for (int i=0; i < oArr.length; i++) {
			oArr[i].sound();
		}
	
	}

}

class Human extends Animal {
	
}
class Asia extends Human {
	String rice;
}
class Korean extends Asia {
	String ssn;
	
	void myInfo( ) {
		System.out.println("이름은 " + name + "입니다.");
		System.out.println("나이는 " + age + "살 입니다.");
		System.out.println( "주민번호는 " + ssn + "입니다.");
	}
	
	@Override
	public void sound() {
		System.out.println("살려줘");
	}

}

class KorShort extends Cat {
	
}

class MZ extends Korean {
	String name = "pyo";
	int age = 0;
			
	@Override
	void myInfo() {	// 950228 - *******
		System.out.println("이름은 " + name + "입니다.");
		System.out.println("나이는 " + age + "살 입니다.");
		System.out.println( "주민번호는 " + ssn.substring(0, 8) + "*******입니다.");
	}
}​

BOWOW					// Dog의 메소드 실행 (오버라이드한 sound() 메소드)
Mew~ Mew~				// Cat의 메소드 실행 (오버라이드한 sound() 메소드)
자식마다 소리가 달라요		// Human은 비어있음. 그래서 부모의 sound() 메소드 실행

---메인메소드

배열 타입을 Animal 이 아닌 Object로 할 경우......... 아직모르겠음....

....

public class Inheritance {	
	public static void main(String[] args) {		
        
        Object[] oArr = new Object[3];
		oArr[0] = new Dog();
		oArr[1] = new Cat();
		oArr[2] = new Human();
		
		for (int i=0; i < oArr.length; i++) {
			((Animal) oArr[i]).sound();		// 부모 클래스로 캐스트필요
		}
        
    }
}


.....

....

public class Inheritance {	
	public static void main(String[] args) {		
        

        Animal aaa = new Dog();
        Animal aaa4 = new Korean(); 
        aaa4.sound();
        캡쳐참고 - 파란부분은 Korean에만 있는부분이라 숨겨짐

        Korean kor = (Korean) aaa4; 캐스트 걸어주면
        이제는 Korean에만 있는 기능들 사용가능

        kor.myInfo();
        ( (Korean) aaa4 ).myInfo();
        ---> 다형성관련
    }
}

.....

얘도 아직 모르겠다

다형성 어쩌구

 

Animal aaa = new Dog();
Animal aaa4 = new Korean(); 
aaa4.sound();
캡쳐참고 - 파란부분은 Korean에만 있는부분이라 숨겨짐

Korean kor = (Korean) aaa4; 캐스트 걸어주면
이제는 Korean에만 있는 기능들 사용가능

kor.myInfo();
( (Korean) aaa4 ).myInfo();
---> 다형성관련

 

==============================


List<Integer> l = new ArrayList<>();
List 가 부모, ArrayList가 자식

Set<Integer> s = new HashSet();
Map<Integer, Integer> m = new HashMap();
얘네도 마찬가지 ...

다형성 - 타이어같은느낌... 다양하지만 기능은 똑같