-
중첩 ,내부 ,익명 클래스프로그래밍/JAVA 자바 2021. 7. 28.반응형
package ex0727; public class Ex01 { public static void main(String[] args) { // 중첩 클래스 Test1.User1 u = new Test1.User1(); //<< 중첩 클래스의 객체 생성 User가 단독 클래스가 아니라서 이렇게 해야함 // Test1의 객체가 생성된 것은 아님. u.write(); } } class Test1 { int a = 10; static int b = 0; // static 중첩 클래스 // 외부 클래스의 객체 생성과 상관없이 객체를 생성하여 사용할 수 있는 클래스 // 컴파일 하면 Test1$User1.class 파일이 생성 static class User1 { //Test1이(객체 생성 안해도) 메모리 할당 안받아도 사용 가능 //static이 붙어있음 int x = 100; public void write() { //System.out.println(a); // 컴 오류 System.out.println(b); // 메모리 할당 받아서 가능 } public void diso() { Test1 t = new Test1(); System.out.println(t.a); t.print(); } } public void print() { System.out.println(a + ", "+ b); } public static void sub() { //System.out.println(a); // 컴파일 오류 클래스 메소드는 인스턴스 변수 접근 불가능 System.out.println(b); } }
클래스 안에 클래스 생성
static이 붙어있으면 Test1 안에 속해 있더라도 Test1의 객체가 필요 없이
사용이 가능하다.
그래서 메인에서 객체 만들때 Test1.User1 u = new Test1.User1()의 형태로 만들 수 있다.
내부 클래스
package ex0727; public class Ex02 { public static void main(String[] args) { // 내부 클래스 //Test2.User2 ob = new Test2.User2(); // 컴파일 오류 내부 클래스는 외부에서 단독으로 객체 생성 불가능 //내부 클래스는 외부 클래스의 객체를 생성한 후에 생성된 객체를 이용해서 생성 Test2 ob = new Test2(); Test2.User2 uu = ob.new User2(); } } class Test2 { int a = 10; static int b = 20; // 내부 클래스 member class // 외부 클래스(Test2) 객체가 생성되어야 객체를 생성할 수 있는 클래스 class User2 { int x = 100; public void write() { System.out.println(a+", "+b+", "+x); // 외부 클래스의 인스턴스 변수나 인스턴스 메소드 접근 가능 //print(); 이것도 가능 } } public void print() { System.out.println(a+", "+b); } public void sub() { // 메소드 내에서 내부 클래스의 객체 생성 및 활용 User2 u = new User2(); u.write(); } }
맨위의 중첩 클래스와는 다르게
static이 붙어있지 않아서 혼자서 사용 불가능하고
Test2의 객체를 만들어야 사용이 가능하다.
Test2 ob = new Test2(); = 먼저 Test2의 객체를 만들고
Test2.User2 uu = ob.new User2(); = 그리고나서 User2 객체를 만들 수 있다.익명 클래스
package ex0727; public class Ex03 { public static void main(String[] args) { // TODO Auto-generated method stub User3 ob = new User3(); ob.sub(); } } interface Test3 { public void print(); } class User3 { public void sub() { // anonymous class 익명 클래스(클래스는 필요한데 이름까진 주면서 따로 생성하고 싶지 않을때) //Test3 t = new Test3(); 컴오류 인터페이스는 객체 생성 불가능 Test3 t = new Test3() { //익명 클래스에서 인터페이스 메소드 재정의 @Override public void print() { // TODO Auto-generated method stub System.out.println("print"); } }; t.print(); } public void disp() { Test3 t = new Test3() { @Override public void print() { System.out.println("disp"); } }; t.print(); }; }
익명 클래스로 재정의 하기
package ex0727; public class Ex04 { public static void main(String[] args) { // TODO Auto-generated method stub Object ob1 = new Object(); System.out.println(ob1); //클래스명@해쉬코드 Object ob2 = new Object() { @Override public String toString() { return "익명 클래스로 재정의"; } }; //<<세미콜론 의미가 익명 System.out.println(ob2); } }
열거형
package ex0727; public class Ex06 { public static void main(String[] args) { // 열거형 상수의 기수(선언 위피) 출력 for(Color c : Color.values()) { System.out.println(c + "->" + c.ordinal()); } System.out.println(); Test6 ob = new Test6(); System.out.println(ob.getColor()); ob.setColor(Color.BLUE); Color color = ob.getColor(); //case에서는 enum은 enum명 생략 가능(Color 생략 가능) switch(color) { case RED : System.out.println("red"); break; case GREEN : System.out.println("green"); break; case BLUE : System.out.println("blue"); break; } } } enum Color { //열거형 RED, GREEN, BLUE } class Test6 { private Color color = Color.RED; public void setColor(Color color) { this.color = color; } public Color getColor() { return color; } }
열거형 다른 예
package ex0727; public class Ex07 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(City.SEOUL); // toString()이 재정의 되어 있지 않으면 SEOUL만 출력 System.out.println("서울 : " + City.SEOUL.getCount()); System.out.println("\n전체 리스트..."); for(City c : City.values()) { System.out.println(c.getName() + " : " + c.getCount()); } } } //열거형 상수에 값 할당 - 생성자를 만들어야함 enum City { SEOUL("서울", 1000), BUSAN("부산", 350), INCHEON("인천", 330); private String name; private int count; //생성자는 private만 가능, 생략해도 private임 private City(String name, int count) { this.name = name; this.count = count; } public String getName() { return name; } public int getCount() { return count; } @Override public String toString() { // TODO Auto-generated method stub return this.name + "인구 : "+this.count + "만명"; } }
package ex0727; public class Ex08 { public static void main(String[] args) { // TODO Auto-generated method stub double a; a = Operation.PLUS.eval(10, 5); System.out.println(a); double x = 10; double y = 5; for(Operation op : Operation.values()) { System.out.printf("%.1f %s %.1f = %.1f\n",x,y,op,y,op.eval(x, y)); } } } // 열거형 상수 - 메소드 정의. 추상 메소드가 선언 되어야함 enum Operation { PLUS { public double eval(double x, double y) {return x+y;}}, MINUS { public double eval(double x, double y) {return x-y;}}, TIMES { public double eval(double x, double y) {return x*y;}}, DIVIDE { public double eval(double x, double y) {return x/y;}}; public abstract double eval(double x, double y); }
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
throw / throws (0) 2021.07.29 예외 잡기 (try, catch, finally문) (0) 2021.07.29 추상 클래스 / 인터페이스 (0) 2021.07.26 오버라이드 / 오버로딩 / 클래스 상속 (0) 2021.07.24 클래스 상속, override (0) 2021.07.22