[[TableOfContents]] == 일시 == * 오후 12 : 10 ~ == 참가자 == || 유재범 || 참석 || || 최다인 || 불참 || || 이지수 || 참석 || || 김용준 || 참석 || || 김정민 || 참석 || == 진행 상황 == * [유재범] 학우의 발표 * JAVA의 정석 7-5~ === 발표 내용 === * 클래스 중첩 : 여러 클래스를 관리 할 때 클래스 안에 다시 클래스를 선언하여 중첩시키는 것. {{{ Outer 객체1 = new Outer(); //Outer 클래스 객체 생성 방법 Outer.Inner 객체2 = 객체1.new Inner(); //Inner 클래스 객체 생성 방법 }}} * 컴파일러를 돌리고 윈도우 탐색기를 이용하면 Outer$Inner.class 라는 파일도 있을 것이다. 이 파일이 바로 중첩된 클래스를 나타내는 것이다. * Inner 클래스에서는 Outer 클래스의 멤버를 이용할 수 있다. 하지만 Outer 클래스에서 Inner 클래스의 멤버를 이용하려면 객체를 직접 선언해야 한다. * Outer 내부에서 Inner의 멤버를 사용하기 위해 객체를 선언하려면 현재 클래스의 객체를 대변하는 this가 있어야 한다. * static 메서드 내부에서는 일반 중첩 클래스의 객체가 선언 될 수 없다는 것 * 또 Inner 내부에 static과 관련된 멤버를 선언하는 것도 컴파일 에러를 발생시킨다 * 정적 중첩 클래스 : 중첩 클래스 내부에서 static과 관련된 멤버를 선언할 수 있는 클래스 * 일반 중첩 클래스 내부에는 static과 관련된 멤버를 선언할 수 없다. 그러나 Outer 클래스의 멤버를 단지 이용만 할 때에는 static이든 아니든 관계 없이 이용 할 수 있다. {{{ class Outer{ static class Inner{ .......... } } }}} * 정적 중첩의 클래스는 static의 특성상 객체를 독립적으로 만들 수 있다. * Outer.Inner 객체 = new Outer.Inner(); * Outer 클래스의 객체가 없어도 Inner 클래스의 객체를 만들 수 있다. * 또한 static 멤버를 선언 할 수 있고 static 메서드도 만들어 사용 할 수 있다. * 그래서 Inner 클래스 내부에 static을 선언하여 사용하고 싶다면 정적 중첩 클래스를 사용해야 한다. 객체 선언 방식은 위와 같은 방식으로만 발생시킬 수 있따. * Outer 클래스의 멤버는 static일 경우에만 사용할 수 있다. 이것은 마치 일반 멤버를 static 메서드 내부에서 사용할 수 없는것과 유사하다 {{{ public class Round12_Ex04 { public static class Inner3{ public static void main(String[] ar){ System.out.println("Inner 클래스 내부의 main 메서드"); } } } }}} * 위와 같은 경우 java Round12_Ex04로 실행하면 main() 메서드가 Inner 클래스 내부에 있기 때문에 찾을 수 없어 JVM이 main()을 찾을 수 없다는 에러가 뜬다. 그래서 실행 시킬때에는 java Round12_Ex04$Inner3으로 실행을 해야 한다. * 이것은 실제 메서드가 있는 곳을 지칭하는 것이다. * 지역 중첩 클래스 : 특정 메서드에 한정적인 용도로 사용할 클래스로 등장 * 일반적으로 보통 클래스와 동일하나 접근 제한자와 지정 예약어를 사용할 수 없다는 형태이다. * 만일 일반 중첩 클래스처럼 main() 메서드의 멤버를 사용하려면 그 멤버는 반드시 final로 선언되어 있어야만 한다. * 컴파일을 하면 Round12_Ex06.class 외에 Round12_Ex06$1Inner5.class라는 클래스가 생성된다. * 일반 중첩 클래스와 유사하가 static 멤버를 선언하지 못한다. * 익명 중첩 클래스 : class라는 예약어와 클래스 명을 가지지 않고 단지 instance의 생성과 내용부의 정의만 가지고 있는 클래스 * 지역 중첩 클래스의 변형된 형태 * 다만 여기에 사용되는 중첩 클래스는 이미 기존에 존재 하는 것이어야 한다. * 또한 이 내에서 사용 할 수 있는 외부 데이터도 final로 선언되어 있어야 한다. * 내용부가 서로 다른 특정 메서드의 실행을 주관 하기 위해서 사용 * 접근 제한자의 사용에 주의해야 한다. 자기 자신의 멤버일지라도 정의되는 영역이 다르기 때문이다. {{{ class Inner6{ int y = 200; public Inner6(){ this.disp(); } public void disp(){} } public class Round12_Ex07 { public static void main(String[] ar){ final int x = 100; new Inner6(){ public void disp(){ System.out.println("Default 생성자"); System.out.println("x = " + x); System.out.println("y = " + y); } }; } } }}} * 위 예시를 컴파일 후 탐색기로 클래스 파일을 찾아보면 Inner6.class, Round12_Ex07.class, Round12_Ex07$1.class. 이렇게 3개가 생성이 된다. * 이 중 마지막이 익명 중첩 클래스인다 이름에서 알 수 있듯이 익명이기에 숫자로 그 클래스를 표시한다. * 만약 main() 메서드 내부에 다른 익명 중첩 클래스가 있다면 이 클래스는 Round12_Ex07$2.class가 될 것이다. * 익명 중첩 클래스는 내부에 생성자를 작성할 수 없다. * 만약 작성하면 invalid 메서드 declaration 이렇게 뜰 것이다. * 다형성 : 여러개의 개별적 클래스를 하나의 부모 클래스 객체로 통합하여 관리하여 그 효율성을 높인 것 * 예 : 배열 * 다형성의 표현 {{{ A ap = new A(); A bp = new B(); A cp = new C(); }}} * 여기서 중요한 것은 자신의 클래스 객체가 아니지만 자신의 부모 클래스라면 인스턴스를 부모 객체에 담을 수 있다는 것이다. {{{ class A3{ public String toString(){ return "A3 클래스"; } } class B3{ public String toString(){ return "B3 클래스"; } } public class Round13_Ex01 { public static void main(String[] ar){ A3 ap = new A3(); B3 bp = new B3(); System.out.println("ap = " + ap); System.out.println("bp = " + bp); } } }}} * 위 클래스 A3, B3는 언뜻 보면 연관이 되어 있지 않지만 사실 다형적인 표현을 사용할 수 있다. * 왜냐하면 모두 Object를 부모로 두기 때문이다. 그래서 이를 아래와 같이 사용 할 수도 있다. {{{ public class Round13_Ex01 { public static void main(String[] ar){ Object[] obj = new Object[2]; obj[0] = new A3(); obj[1] = new B3(); for(int a = 0; a