본문 바로가기

JAVA

JAVA(2022.05.08)-클래스 형변환 , interface

클래스 형변환

- 부모타입으로 자식객체를 참조하였을 때, 자식객체의 메소드나 속성을 사용하려면 클래스 형변환을 해야한다. 

- 부모타입으로 자식객체를 참조할 때 묵시적 형변환

- 자식타입으로 부모객체를 참조할 때 명시적 현변한 

 

    public class Car{
        public void engine(){
            System.out.println("Car의 메소드");
        }
    }

    public class Bus extends Car{
        public void sound(){
            System.out.println("빵빵.");
        }   
    }
    public class BusExam{
        public static void main(String args[]){
            Car car = new Bus();
            car.engine();
            //car.sound(); // 컴파일 오류 발생

            Bus bus = (Bus)car;  //부모타입을 자식타입으로 형변환 
            bus.engine();
            bus.sound();
        }
    }

 

인터페이스(interface)

 

definition

 

-An interface in Java is a blueprint of a class. It has static constants and abstract methods.(쉽게 말해서 클래스를 어떻게 구성해야하는지에 관한 설계도면이다.

-The interface in Java is a mechanism to achieve abstraction(추상화를 이루기 위한 메커니즘)

 

characteristics

 

Let's figure out characteristics about 'Interface' in Java through examples

 

interface A{
	public void a():
}


//implements는 해당 클래스가 인터페이스를 구현한다는 의미.구현하려면 interface의 메소드를 무조건 포함하고 있어야한다.

class B implements A {
	public void a();
}

 

- 구현하는 클래스는 인터페이스의 메소드를 반드시 포함해야한다(강제성을 지님)

- 하나의 클래스가 여러개의 인터페이스를 구현할 수 있다.

- 인터페이스도 상속이 가능하다

- 인터페이스는 추상메서드와 상수만 가질 수 있다.

- 인터페이스도 참조형이 될 수 있다. ex) TV라는 interface와 remote라는 class(implements해주는)가 있을 때 TV tv = new remote();로 객체화가 가능하다. 

 

왜 그렇게 중요할까 ? 

예시를 보며 알아보자 

    public interface TV{
        public int MAX_VOLUME = 100;
        public int MIN_VOLUME = 0;

        public void turnOn();
        public void turnOff();
        public void changeVolume(int volume);
        public void changeChannel(int channel);
    }
    
    public class LedTV implements TV{
        public void on(){
            System.out.println("켜다");
        }
        public void off(){
            System.out.println("끄다");   
        }
        public void volume(int value){
            System.out.println(value + "로 볼륨조정하다.");  
        }
        public void channel(int number){
            System.out.println(number + "로 채널조정하다.");         
        }
    }
    //메소드에서 System.out.println();을 통해 어떤 값을 출력해낼게 아니라면
    //return을 통해서 값을 돌려주는 방법도 있다
    public class LedTVExam{
        public static void main(String args[]){
            TV tv = new LedTV();
            tv.on();
            tv.volume(50);
            tv.channel(6);
            tv.off();
        }
    } 
    
    //여기서 TV종류가 LED뿐만 아니라 LCD가 추가되어야할 때, interface에 이미 구현해야할 메소드들이 선언되어 있기 때문에
    //class에서 해당 메소드가 어떻게 행동해야하는지에 대해서만 추가해주면 훨씬 더 코드가 깔끔해진다.

- 다른 클래스(예시로 LCDTV)에 대한 코드를 작성할 때, interface에 작성된 메소드에 대해서 어떻게 행동해야하는지만 정의내려준다면 훨씬 더 편리해진다. 

 

 

what is the difference between an interface and abstract class? 

-  interface는 일종의 계약(contract)이다. interface를 작성한 사람이 "나 이렇게 할게" 라고 한다면 interface를 사용하는 사람은 "그러면 이 방식대로 클래스를 작성할게". 

-  interface의 메소드는 body부분이 없다. interface는 아무 것도 홀로 할 수 없고 패턴일 뿐이다.

-  abstract classs는 행동(메소드)를 정의내릴 수 있다. > 메소드 오버라이딩을 통해 부모클래스의 메소드를 자식클래스에서 재정의 가능하다 .

 

 

 

 

 

 

 

*본 게시물은 프로그래머스<자바입문>강의를 복습하며 작성한 글입니다.