[신세계I&C KDT][Java 프로그래밍] #10 추상 클래스, 인터페이스 (0320)

박현아·2024년 3월 20일
0

신세계아이앤씨 KDT

목록 보기
10/42

1. 다형성의 적용

  • 타입 비교하는 방법 : 변수명 instanceof 클래스 -> boolean 반환
  • 문제 1 : 배열에서 Secretary만 출력하시오.
Employee[] empArray = {new Employee("강감찬", 100), new Manager("지다솜", 6000, "인사"), 
					new Engineer("박현아", 6000, "JAVA"), 
					new Secretary("문지해", 6000), new Secretary("문지해2", 6000),
					new Secretary("문지해3", 6000)};

for (Employee e : empArray ) {
		if(e instanceof Secretary) {
		System.out.println(e.getEmployee());
	}
}
  • 형변환 : 필요시 작은타입 변수 = (작은타입) 큰타입; (강제형변환)
  • 문제 2: 배열에서 Manager에 추가된 depart만 출력하시오
for (Employee e : empArray ) {
	if(e instanceof Manager) {
	// 형변환 - 부모에는 없고 자식에만 추가된 경우
	Manager m = (Manager) e ;
	System.out.println(m.getDepart());
	}
}

2. java.lang.Object 클래스

  • 모든 클래스들의 최상위 클래스 (root 클래스)
  • 클래스 생성(new)할 때 가장 먼저 생성된다
  • 8개의 메서드를 구성 요소로 가지고 있다
    -> Object 메서드를 그냥 사용할 수도 있고, 필요시 오버라이딩 할 수 있다

1) Object의 toString()

  • 클래스가 있는 주소값을 문자열로 반환해주는 기능
  • 자동으로 호출됨 (콘솔에 참조변수를 출력할 때)
    (System.out.println(t);
    System.out.println(t.toString());) 두 개 값이 똑같음

2) 오버라이딩된 toString()

  • 사용자가 만든 클래스에서는 거의 대부분 오버라이딩 해서 사용한다
@Override
public String toString() {
	return "Test [num=" + num + ", num2=" + num2 + "]";
}
  • Java API는 다 오버라이딩 되어 있음
    • 예> String s = "hello"; // toString()을 쓰지 않아도 s값이 나옴
      System.out.println(s);
      System.out.println(s.toString());

cf) 클래스 작성 구성 요소
1. 변수
2. 생성자
3. getter/setter
4. toString 오버라이딩 (안하면 값을 출력하는 메서드를 따로 만들어야됨)
5. 유효성체크 메서드 (옵션)

3. 접근 지정자 (access modifier)

1) 용도

: 클래스간의 접근(참조)을 제한하는 방법

2) 4가지 레벨

4. 추상 클래스 (abstract class)

1) 문법

public abstract class 클래스명{

}

2) 구성 요소

(1) 변수

(2) 생성자

(3) 일반 메서드 (concrete method)

: {}를 가져서 기능이 정해짐

public void a() {
	실행문;
}

(4) 추상 메서드 (abstract method)

: {} 지정 안함. 미지정된 상태, 나중에 지정됨.

public abstract void a();

-> abstract 키워드 필수 !
-> 추상 메서드를 가지면 반드시 추상 클래스로 만들어야 된다

3) 특징

  • 불완전한 클래스 -> 객체 생성이 불가능하다 (new 불가)
  • 불완전 클래스인 자신은 인스턴스화 X, 상속된 자식 클래스를 이용해 추상클래스의 구성요소를 인스턴스화 할 수 있다 ★
// 부모클래스
public abstract class AAA {
	
}
AAA a = new AAA(); // 에러 발생 !!
  
// 자식 클래스
public class BBB extends AAA { // 부모의 변수, 메서드 사용 가능
// 부모의 추상메서드를 반드시 오버라이딩 해야된다 !!!!
	
}
  • 추상클래스는 자식 클래스보다 큰 타입이므로 다형성 적용 가능
    • AAA b2 = new BBB(); 가능
  • UML에서 이탤릭체로 표현

4) 목적

: 부모의 추상메서드를 반드시 자식클래스에서 오버라이딩 해야되는 강제성을 주는 것
-> 부모의 추상 메서드 이름을 따라 자식 메서드가 통일되게 강제 할 수 있다

 abstract Pet
-name, age
-abstract eat(); 

    Cat                     Dog                   Bird
 @Override               @Override               @Override
eat(){s.o.u("쩝쩝");}    eat(){s.o.u("냠냠");}    eat(){s.o.u("짹짹");}

5. 인터페이스 (interface)

1) 문법

public interface 인터페이스명 {
 	int N = 20; // public static final int N=20; 과 동일
    abstract void a(); // 접근 지정자 default아니고 public임
 } //인터페이스명.java로 저장됨

2) 구성 요소

(1) 상수

- final int NUM = 20;
- public static final 지정자가 자동으로 붙는다
- 접근은 인터페이스명.상수명 으로 사용

(2) default 메서드

- public default 리턴타입 메서드명([변수,...]) { 실행문; }
- 클래스의 인스턴스 메서드처럼 동작 (객체 생성 후 사용)

(3) static 메서드

- public static 리턴타입 메서드명([변수,...]) { 실행문; }
- 클래스의 static 메서드처럼 동작 (객체 생성 없이 클래스명.static메서드 로 사용 가능

(4) 추상 메서드 (abstract method)

- public abstract 리턴타입 메서드명([변수,...]);
- public abstract 지정자가 자동으로 붙는다 (인터페이스에서만 abstract 키워드 생략 가능)

3) 특징

  • 불완전한 객체 -> 객체 생성이 불가능하다 (new 불가)
  • 불완전 객체인 자신은 인스턴스화 X, 상속이 아닌 구현을 통한 자식 클래스를 이용해 인터페이스의 구성요소를 인스턴스화 할 수 있다
  • 구현시 implements 사용
  • 다중 구현 가능 (implements A, A2)
  • 인터페이스간에는 상속 관계 (extends) (다중 상속 지원)
  • 추상 메서드를 사용하기 위함이 주 목적
// 하위 클래스
public class B implements A, A2 {
      //준부모(인터페이스)의 상수 사용
	 //준부모의 default 메서드, static 메서드 사용
     //준부모의 추상메서드를 반드시 오버라이딩(overriding)해야하는 제약이 붙는다.
	   만약에 추상메서드를 오버라이딩하지 않으면 에러가 발생된다.
}

4) 목적

(1) 인터페이스에서 지정된 추상 메서드명을 하위 클래스에서 사용하도록 강제

abstract Pet          			interface Flyer {
-name, age						abstract fly();
-abstract eat(); 				}


Cat extends Pet        				Dog extends Pet                  
@Override              				@Override               
eat(){s.o.u("쩝쩝");}   				eat(){s.o.u("냠냠");} 

Bird extends Pet implements Flyer		Bat extends Pet implements Flyer
@Override								@Override
eat(){s.o.u("짹짹");}    					eat(){s.o.u("짹짹");}
@Override								@Override
fly(){}									fly(){}

(2) 클래스간의 의존성 감소 ★ (loosely coupling)

  • 코드가 바뀌었을 때 연결된 코드 부분을 많이 안 고쳐도 됨

cf) 클래스, 추상 클래스, 인터페이스 비교

0개의 댓글