[[TableOfContents]] == 일시 == * 오후 12 : 10 ~ 오후 1 : 50 == 참가자 == || 유재범 || 참석 || || 최다인 || 불참 || || 이지수 || 참석 || || 김용준 || 참석 || || 김정민 || 참석 || == 진행 상황 == * [유재범] 학우의 발표 * 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= 2){ System.out.println("반납하실 책이 없읏비니다."); } else{ rentcode --; bocount++; } } public void WatchBookInfo() throws IOException{ Book2 watbok = new Book2(); watbok.getwriter(writer); watbok.getbook(book); watbok.getbocom(bocom); count++; } public void setBookInfo(){ System.out.println("책 제목 : " + book); System.out.println("저자 : " + writer); System.out.println("출판사 : " + bocom); System.out.println("고유 코드 : " + bocode+count); System.out.println("잔여 도서량 : " + bocount); } } } public class Library { public static void main(String[] args) throws IOException{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Member2 memmenu = new Member2(); Book2 bookmenu = new Book2(); while(true){ boolean boolmenu = false; int menunum = 0; System.out.print("무엇을 하시겠습니까?" + "(1.회원증 생성 " + "2.회원 정보 확인 " + "3.책 정보 입력 " + "4.책 정보 확인 " + "5.책 대여 " + "6.책 반납) : "); do{ boolmenu = false; }while(boolmenu); try{ menunum = Integer.parseInt(in.readLine()); if(menunum > 6 || menunum <= 0){ System.out.println("잘못된 숫자입니다."); boolmenu = true; } }catch(NumberFormatException nfe){ System.out.println("잘못된 숫자입니다."); boolmenu = true; } if(menunum == 1){ memmenu.Addmem(); continue; } else if(menunum == 2){ memmenu.Watchmem(); continue; } else if(menunum == 3){ bookmenu.WatchBookInfo(); continue; } else if(menunum == 4){ bookmenu.setBookInfo(); continue; } else if(menunum == 5){ bookmenu.bookRent(); continue; } else if(menunum == 6){ bookmenu.bookReturn(); continue; } } } } }}} * 반복을 넣긴 했는데 책을 등록할 때, 회원 등록 할 때 그걸 저장해서 나중에 불러오고 싶었으나 어떻게 할 줄 몰라 실패 * 회원 정보나 책 정보를 넣으면 들어가기는 하는데 나중에 뽑을 때 초기 값으로 나온다. 왜이러지? * 기타 필요 없거나 하나로 통일 될 수 있는 기능은 통일했습니다. 쓸데없이 여러가지 같은거 넣을 필요는 없을거 같았습니다. * 생각해보니 다형성 쓸 필요가 없었습니다. * 인터페이스를 main 클래스에서 받아서 쓰려니까 오류가 났는데 질문을 할 수도 없고 해서 그냥 import로 받았는데 이거 왜이러는지 아시는분 답변좀요. * 하면 재밌는데 하기 전에 진짜 죽어도 하기 싫어서 큰일 날뻔했습니다. * 다른 사람은 몰라도 김용준 과제 안하면 간식 사와라... * 고쳐왔는데 결국 저장이 되도 계속 날라가네... 이 이상을 다른 선배님들께 물어봐도 내 코드가 잘못됬다는데 누구 코드좀 봐줄 사람 없으신가? === 최다인 === {{{ }}} === 이지수 === {{{ }}} === 김용준 === {{{ }}} === 김정민 === {{{ }}} == 후기 == * 주말에 과제만 하면 되겠군... - [유재범] * 금요일날 일찍 고향에 내려와야 되서 불참합니다. - [김용준] * 이번주 목요일은 그린팩토리로 없을거고 다음주 월요일이 불참인건가? - [유재범] * 아 금요일날 안하는구나. 착각함 ㅋㅋㅋㅋ - [김용준] ---- [한자공/시즌3]