D+12::오버라이딩/@Override 어노테이션/다형성/Object클래스/equals()/toString()

Am.Vinch·2022년 7월 12일
0

220220712

프로젝트명 Inheritance2

public class Super {
	public void hello() {
		System.out.println("Hello~");
	}
}

class Sub extends Super{
	//[매소드 오버라이딩](매소드 재정의,덮어쓰기)
	//주의
	//매소드명 + 매개변수 정보 + 생성자명 모두 똑같아야한다.
	
	
	public void hello() { //super클래스 메소드와 똑같이 만듦.
			//super클래스 상속이기때문에 눈에 안보이지만 사실 2개 중복으로 존재하는 것임.
		    //메소드명 + 매개변수정보 모두 일치한 똑같은 메소드를 말함.
		System.out.println("Hi~"); 
			// 같은 메소드명 내 내용이 달라져도 가능하다.
			// Hello >> Hi 변경.
		
	@Override 
	[어노테이션] anotation
		실수 방지를 위해 오류가 맞는지 알려줌
        
   cf)
    [오버로딩]
		메소자명은 같으나 매개변수정보가 불일치해서 중복하여 여러개 만들 수 있음.
        public void Hello(int a) { //@override 어노테이션을 통해서 오버라이딩이 아닌지 알 수 있음.
			System.out.println("ddd");
			
			
	}
}
			
	


[오버라이딩]
public class Overriding {
	public static void main(String[] args) {
		Sub sub1 = new Sub(); // 객체생성
		sub1.hello();
		//매소드오버라이딩을 사용해서 부모클래스가 아닌 본인클래스 내용 덮어쓰기됨.
		//본인이 재정의한 내용만 호출됨.
		// Hello >> Hi 로 출력됨.
	
		
		// 부모 클래스 내용 호출하는 방법
		Super s = new Super();
		s.hello();
	
	}
}

다형성

public class PhoneTest {
	public static void main(String[] args) {
		MobilePhone mp1 = new MobilePhone();
		SmartPhone sp1 = new SmartPhone();

		[다형성]
		부모클래스로는 자식클래스를 다 받을 수 있습니다.
		
		부모클래스로 자식클래스를 받는 경우 -> 가능
		MobilePhone mp2 = new SmartPhone();	
		>>!!mp2의 실체는 사실 스마트폰이다.!!
		
        자식클래스로 부모클래스를 받는 경우 -> 불가능
		SmartPhone sp2 = new MobilePhone();
	
		mp2.sendMsg();
		 >>본인 클래스 기능은 바로 사용가능
		
        <오류 발생>
        mp2.playApp();
		 >>실체는 스마트폰이지만 본인이 스마트폰인지몰라서 기능을 사용하지 못한다.
		<해결방법>
        ((SmartPhone)mp2).playApp();
		 >> 아래 예시처럼 자료형 변환해주어야한다!!!
		 >>주의할점) 괄호를 앞 클래스명 모두를 감싸야한다. 
		   cf)정수형 변수 변환 예시
		   double a = 10.5;
		   int b = (int) a;
	}
}

다형성 & 오버라이딩 예제

//동물관리시스템을 만들자.
//강아지,고양이,송아지.....
//우리의 크기는 동물 10마리.

class Animal{
	public void bark() {
		System.out.println("짖어요");
	}
}
public class Dog extends Animal{
	@override
    public void bark() {
		System.out.println("멍멍");
	}
}

class Cat extends Animal{
	@override
    public void bark() {
		System.out.println("냐옹");
	}
}

class Cow  extends Animal {
	@override
	public void bark() {
		System.out.println("음메");
	}
}




[오버라이딩]
부모클래스에서 선언된 매소드를 자식 클래스에서 재정의
이렇게 하면 자식클래스에서 재정의한 메소드만 사용가능
부모클래승서 상속한 메소드의 기능은 사용불가



public class AnimalManager {

	public static void main(String[] args) {
		>>다형성 사용:부모클래스로 자식클래스를 받을 수 있다.
		Animal a = new Dog();
		Animal b = new Cat();
		Animal c = new Cow();
		
		Animal[] house = new Animal[5];
         //동물이 5마리 임의로 들어갈 수 있는 공간을 만듦.
		
        >>다형성 사용
		//자식클래스에서 만든 메소드는 사용 불가.
		house[0] = new Dog();
		house[1] = new Cat();
		house[2] = new Cat();
		house[3] = new Cow();
		house[4] = new Cat();
       
       house[0].bark();//멍멍 o(짖어요 x)
		//house에 실제로 들어온 것은 animal이나, dog에 있는 bark가 실행된다.
		//원래는 자식클래스 메소드기능을 사용할수는 없으나 오버라이딩을 했기때문에 자식클래스 메소드를 사용가능
	
		
		
		for (int i = 0 ; i< house.length; i++) {
			house[i].bark();
            
		}
	}
}


<콘솔창>
멍멍
냐옹
냐옹
음메
냐옹

Object 클래스의 대표 메소드

equals(),toString()

public class Member extends Object { 
	String name;
	int age;
	
	public void aaa() {

		//Object 클래스의 대표 메소드
		///equals(),toString()
	
		//equals(): 두 객체가 같니? >> T/F
		Member m1 = new Member();
		Member m2 = new Member();
		m1.equals(m2);//상속받은 Object클래스 내 포함된 메소드이기때문
		//>>오버라이딩해서 사용해라.
		
		//toString(): 객체를 표현하는 문자열 
		
	}
	

// 마우스오른쪽클릭 > source > generate toStirng 클릭하면 자동완성됨.
    @Override
    public String toString() {
	return "Member [name=" + name + ", age=" + age + "]";
}

	//오버라이딩 사용
	@Override
	public boolean equals(Object obj) 
    //매개변수 (Object obj)의 뜻은 뭐든지 받을 수 있다.(다형성)

//		obj.name = "ddd"; 
//		>>오류발생:obj(부모) -> member(자식) 타입으로 받으면 자식의 메소드기능을 사용하지 못함.
//      >> 오류해결:형변환
//		((Member)obj).name="ddd";
		
		String name = ((Member)obj).name;
		int age = ((Member) obj).age;

		if (this.name.equals(name) && this.age == age) {
			return true;
		}
		else {
			return false;
		}
	}
}



public class MemberTest {
	public static void main(String[] args) {
	 Member m = new Member();
	
	 // 이 둘은 서로 같다.
	 System.out.println(m.toString());//리턴타입 문자열이기때문에 출력문에 넣어주면 출력가능	
   	// name = null / age = 0
	 System.out.println(m);//객체명을 출력하면 자동으로 toString() 메소드를 호출한다.
	 // name = null / age = 0

	}
}
profile
Dev.Vinch

0개의 댓글