-
자바 step10 - interface(implements, orverride, final 예약어)Java 2022. 11. 6. 15:11
[ interface ]
- 생성자가 없다 (단독 객체 생성 불가).
- 구현된 메소드는 가질수 없다 ( 추상 메소드만 가질수 있다 ).
- 필드는 static final 상수만 가질수 있다(JS로 치면 const, 한번 선언하면 변경할 수 없다.).
- data type 의 역할을 할수 있다.
- interface type 의 참조값이 필요하면 구현(implements) 클래스를 만들어서 객체를 생성해야 한다.
- 클래스 상속은 단일 상속이지만, 인터페이스는 다중 구현이 가능하다.package test.mypac; public interface Remocon { /* * 필드는 static final 필드만 가질 수 있다. (static final 생략 가능) */ public static final String COMPANY="LG"; // 추상 메소드만 정의할 수 있다. public void up(); public void down(); }
package test.mypac; public class MyRemocon implements Remocon { @Override public void up() { System.out.println("볼륨을 올려요"); } @Override public void down() { System.out.println("볼륨을 내려요"); } }
Remocon은 interface라고 선언하였기 때문에 추상 메소드만 정의할 수 있다. 즉, 값을 넣을 수 없다.
그것을 MyRemocon class에서 implements 로 상속받아 override로 재정의하는 것으로 up, down 메소드가 사용 가능해진다.
package test.main; import java.util.ArrayList; import test.mypac.MyRemocon; import test.mypac.Remocon; public class MainClass01 { public static void main(String[] args) { final Remocon r=new MyRemocon(); r.up(); r.down(); String a= Remocon.COMPANY; System.out.println(a); /* * 필드나 지역변수에 final 이라는 예약어를 붙이면 변수가 아니고 상수가 된다. * 상수는 값이 변경되지 않는 것이 상수이다 * 따라서 아래의 num, name, r2 에 다른 값을 다시 대입할 수가 없다. * javascript 로 치면 const 이다. */ final int num=10; final String name="kim"; final Remocon r2=new MyRemocon(); /* * 관례상 final 지역변수나 필드는 모두 대문자로 표기한다. * * 숫자를 상수화 시키면 복잡한 숫자에 이름을 부여하는 효과를 준다. * * 문자열을 상수화 시키면 혼돈하기 쉬운 문자열에 이름을 부여하는 효과를 준다. * * 프로그래머가 복잡한 숫자나 혼돈하기 쉬운 문자열을 쉽게 불러다 쓸 수 있도록 도움을 준다. */ final double PI=3.14159; final String GREET_KOR="안녕하세요"; final String GREET_ENG="hello"; final String GREET_JPN="곤니찌와"; final String GREET_CHN="니하오"; } } <console> 볼륨을 올려요 볼륨을 내려요 LG
final 예약어
* 필드나 지역변수에 final 이라는 예약어를 붙이면 변수가 아니고 상수가 된다.
* 상수는 값이 변경되지 않는 것이 상수이다
* 따라서 위의 num, name, r2 에 다른 값을 다시 대입할 수가 없다.* JS로 치면 const, 한번 선언하면 변경할 수 없다.
* 관례상 final 지역변수나 필드는 모두 대문자로 표기한다.
* 숫자를 상수화 시키면 복잡한 숫자에 이름을 부여하는 효과를 준다.
* 문자열을 상수화 시키면 혼돈하기 쉬운 문자열에 이름을 부여하는 효과를 준다.
* 프로그래머가 복잡한 숫자나 혼돈하기 쉬운 문자열을 쉽게 불러다 쓸 수 있도록 도움을 준다.package test.main; import test.mypac.Remocon; public class MainClass02 { // Remocon 인터페이스를 구현한 inner class static class YourRemocon implements Remocon{ @Override public void up() { System.out.println("볼륨을 올려요"); } @Override public void down() { System.out.println("볼륨을 내려요"); } } public static void main(String[] args) { Remocon r1=new YourRemocon(); useRemocon(r1); } //Remocon 인터페이스 type 을 인자로 전달받는 static 메소드 public static void useRemocon(Remocon r) { r.up(); r.down(); } } <console> 볼륨을 올려요 볼륨을 내려요
따로 class를 만들지 않고 Main class에서도 YourRemocon class를 만들고 Remocon을 상속받으면 재정의하여 사용할 수 있다.
package test.main; import test.mypac.Remocon; public class MainClass03 { public static void main(String[] args) { Remocon r=new Remocon() { @Override public void up() { System.out.println("볼륨을 올려요"); } @Override public void down() { System.out.println("볼륨을 내려요"); } }; useRemocon(r); useRemocon(new Remocon() { @Override public void up() { System.out.println("채널을 올려요"); } @Override public void down() { System.out.println("채널을 내려요"); } }); } public static void useRemocon(Remocon r) { r.up(); r.down(); } } <console> 볼륨을 올려요 볼륨을 내려요 채널을 올려요 채널을 내려요
전에도 설명한 적이 있는데 객체를 생성하고 override한 뒤에, useRemocon을 호출하여 호출하는 방법과, 처음부터 useRemocon을 호출하면서 객체를 생성하여 재정의 하는 방법이 있다. 편한 방법을 사용하면 된다.
'Java' 카테고리의 다른 글
자바 step10 - interface(@FunctionalInterface) 함수 모양으로 사용할 인터페이스에 붙이는 어노테이션 (0) 2022.11.06 자바 step10 - interface(자바의 람다함수, override) (0) 2022.11.06 자바 step9 - AbstractClass(override) (0) 2022.11.06 자바 step9 - AbstractClass(클래스 안에 클래스(내부 클래스)) (0) 2022.11.06 자바 step9 - AbstractClass(override) (0) 2022.11.06