본문 바로가기
학습/JAVA

7. 상속(Inheritance) (Override 불가, 다형성, List<E>)

by Elfen Lied 2022. 10. 12.
반응형

- 정적 메소드는 오버라이딩 되지 않음

public class Figure {
	static void area() {
		System.out.println("도형의 넓이");
	}
}

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

class Circle extends Figure {
	static void area() {
		System.out.println("도형의 넓이");
	}
}

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

public class FigureMain {
	public static void main(String[] args) {
		Circle.area();
		Figure.area();
	}
}

값
도형의 넓이
도형의 넓이
  • 마치 오버라이딩이 된 것처럼 보인다.
  • 하지만 이것은 오버라이딩이 아니라 하이딩이다.
  • @Override 어노테이션을 추가하면 컴파일 에러가 난다

 

 

 

- 상속할 수 없는 final 클래스

- final이 선언된 클래스는 상속할 수 없다.

오류 내용 : The type SmartPhone cannot subclass the final class Phone

 

 

- 오버라이딩도 불가능

 

 

 

- protected 접근 제한자

  • 상속과 관련된 접근 제한자
    • 동일 패키지 클래스 객체에서 접근할 수 있다.
    • 다른 패키지의 상속관계가 있는 클래스 객체에서 접근할 수 있다.

 

 

- 다형성 (Polymorphism)

  • 상위클래스 타입에 하위클래스 타입을 할당할 수 있다.
  • 하위클래스 타입이 상위클래스 타입에 할당되면 자동타입 변환이 일어난다.
// 상위클래스
public class Hero {
	void move() {
		System.out.println("이동");
	}
	void attack() {
		System.out.println("공격");
	}
	void useUlt() { // 오버라이딩 대상
		System.out.println("궁극기");
	}
}

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

// 하위클래스
public class Arthas extends Hero{

	@Override
	void useUlt() {
		System.out.println("궁극기 사용 : 사자의 군대");
	}
	
	// 상위타입(Hero)에 정의되지 않은 메소드
	void infoArthas() {
		System.out.println("아서스 정보");
	}
}

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

// 메인클래스
public class HeroMain {
	public static void main(String[] args) {
		Arthas a1 = new Arthas();
		a1.attack();
		a1.move();
		a1.infoArthas();
		a1.useUlt(); // 오버라이딩 메소드
		
		// Hero클래스에 정의된 메서드만 접근가능함
		// a2는 Hero 타입의 참조변수
		// a2는 Hero클래스에 정의된 메소드에만 접근가능하다.
		Hero a2 = new Arthas();
		// a2.infoArthas(); 접근 불가
		a2.attack();
		a2.move();
		a2.useUlt(); // Arthas클래스의 메소드에 접근
	}
}

 

 

 

- List<E> 사용

import java.util.ArrayList;
import java.util.List;

public class ListExample {
	public static void main(String[] args) {
		// List 인터페이스
		// 구현클래스 : ArrayList, LinkedList (사용법은 둘다 거의 동일)
		List<String> list = new ArrayList<String>();
		list.add("고길동");
		list.add("둘리");
		list.add("희동이");
		list.add("도우너");
		System.out.println(list);
		
		list.remove("도우너");
		System.out.println(list);
		
		list.remove(0);
		System.out.println(list);
	}
}

배열보다 쓰기 편하다.

List<E> : E 부분에 자료타입을 넣으면 됨. ex) List<String> 변수명;

 

 

- List<E> toString() 처리

import java.util.ArrayList;
import java.util.List;

public class ListExample2 {
	public static void main(String[] args) {
		List<Contact> contactList = new ArrayList<>();
		
		Contact contact1 = new Contact("김철수", "01011112222");
		Contact contact2 = new Contact("박길동", "01033334444");
		contactList.add(contact1);
		contactList.add(contact2);
		
		contactList.add(new Contact("김민수", "01000000000"));
		System.out.println(contactList);
	}
}

// 처음 리스트 생성후 출력하면 해쉬값이 뜸
// [exma17.Contact@7d6f77cc, exma17.Contact@5aaa6d82, exma17.Contact@73a28541]
// 이것을 처리하기위해 상위 클래스에 toString() 생성 해준다.

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

public class Contact {

	private int id; // 자동생성
	private String name;
	private String phoneNumber;
	
    `
    `
    `

	// 이 메소드를 만들어준다.
	@Override
	public String toString() {
		return "Contact [이름 : " + name + ", 연락처 : " + phoneNumber + "]";
	}
	
}

toString() 만드는 법

  1. 빈 곳을 클릭하고 shift + alt + s 누른 뒤
  2. Generate toString()... 클릭 후
  3. 만들것 체크하고 Generate 버튼 클릭

 

반응형

댓글