-
자바&파이썬 웹애플리케이션 전문가 양성과정 채용연계형 교육과정 13일차
KT 자바교육 후기 (2021-07-22 ~ 2021-12-03)
2021-08-09 왜 지하철? 사람 많아?
자바 자바 컬렉션 프레임워크 SET, 오브젝트 중복값, Map 인터페이스 메소드, 자바 내부클래스
자바 지역 내부 클래스, 자바 정적 내부 클래스, 자바 외부클래스, hashMap(), hashcode(), 익명클래스
[오전]
순서와 상관없이 중복을 허용하지 않는 경우에는 Set 인터페이스를 구현한 클래스를 사용합니다. 고객관리 시 데이터 중에 중복을 허용하지 않는 데이터로 아이디, 주문번호 등이 있습니다. HashSet 클래스는 집합 자료 구조를 구현하며 중복을 허용하지 않습니다.
ArrayList와 달리 HashSet에서는 해당하는 아이디를 가진 회원을 찾기 위해 Iterator를 사용하며, 만약 아이디가 같으면 HashSet의 remove() 메소드를 사용하여 해당하는 회원을 삭제합니다.
MemberArrayList.java의 removeMember() 메소드에서는 for문과 get(i)메소드를 사용하여 회원을 순차적으로 하나씩 꺼내면서 매개변수와 같은 아이디를 찾습니다.
그런데 순서가 없는 Set 인터페이스를 구현한 경우에는 get(i) 메소드를 사용할 수 없습니다. 이 때, Iterator를 사용합니다. Iterator를 사용하여 Collection 요소를 순회합니다. 각 요소를 순회하기 때문에 harNext()의 결과가 true면 다음 요소를 가져오는 next() 메소드를 호출합니다. Iterator를 사용하면 순서가 없는 클래스도 요소를 순회할 수 있습니다.
public class Member { private int memberId; //회원 아이디 private String memberName; //회원 이름 public Member(int memberId, String memberName){ //생성자 this.memberId = memberId; this.memberName = memberName; } … @Override public int hashCode() { return memberId; } @Override public boolean equals(Object obj) { if( obj instanceof Member){ Member member = (Member)obj; if( this.memberId == member.memberId ) return true; else return false; } return false; } }
기본적으로 인스턴스 주소가 같으면 같은 객체입니다. 하지만 해당 예제에서는 회원 아이디가 같아도 같은 회원입니다. Member 클래스에서 equals()와 hashCode() 를 재정의하여 회원 아이디가 같으면 같은 회원임을 구현해 주어야 합니다.
public boolean equals(Object obj) { if( obj instanceof Member){ Member member = (Member)obj; if( this.memberId == member.memberId ) return true; else return false; } return false; }
equals() 메소드의 매개변수는object 형입니다. 비교될 객체가 Object형 매개변수로 전달되면 instanceof를 사용하여 매개변수의 원래 자료형이 Member인지 확인합니다. this의 memberId와 매개변수로 전달된 개체의 memberId가 같으면 true를 반환합니다.
public int hashCode() { return memberId; }
해시 함수는 객체의 특정정보를 매개변수 값으로 넣으면 그 객체가 저장되어야 할 위치나 저장된 해시 테이블 주소를 반환합니다. equals()에서 비교하는 값을 memberId로 변경하였기 때문에 hashCode()도 해시코드 값으로 memberId가 리턴되도록 재정의하였습니다.
[오후] 오늘 하루 힘이 든 하루~
>> hashcode(), equals() 예제 풀이
>> JAVA_hashcode(), equals(), remover() 예제. (tistory.com)
>>소스코드 깃허브에서도 확인 가능합니다. (Student ,StudentTest, StudentHashSet)
>>Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09 (github.com)
GitHub - Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09
2021-08-09. Contribute to Kminseokk/KTDS_EDU_0809_JAVA development by creating an account on GitHub.
github.com
'
Map 인터페이스
Map 인터페이스는 하나가 아닌 쌍(pair)으로 선언되어 있는 자료를 관리하는 메소드들이 선언되어 있습니다. key 값은 중복될 수 없습니다. Map은 기본적으로 검색용 자료구조 입니다. 어떤 key 값을 알고 있을 때 value를 찾기 위한 자료구조 입니다.
Map 인터페이스는 자료를 쌍(pair)으로 관리하는데 필요한 메소드가 정의되어 있습니다.
Map 인터페이스에서 구현한 클래스 중 가장 많이 사용하는 것은 HashMap 입니다.
HashMap에서 자료를 관리하는 방식은 해시방식입니다. 해시 방식의 자료를 저장하는 공간을 해시 테이블 이라하고, key 값이 정해지면 그에 대응하는 해시 테이블의 저장 위치가 정해지는데 이런 위치를 계산하는 함수가 해시함수 입니다.
HashMap을 활용하여 key값은 회원 아이디, value는 회원 클래스로 구현해보도록 합니다.
(시러용..ㅠ)>> HashMap 예제
>> JAVA_hashMap(), keySet() 정렬 예제 (tistory.com)
>> 소스코드 깃허브에서도 확인 가능합니다.
>> Kminseokk/KTDS_EDU_0809_JAVA_keySet: 2021-08-09 (github.com)
GitHub - Kminseokk/KTDS_EDU_0809_JAVA_keySet: 2021-08-09
2021-08-09. Contribute to Kminseokk/KTDS_EDU_0809_JAVA_keySet development by creating an account on GitHub.
github.com
내부 클래스
내부클래스는 ‘클래스 내부에 선언한 클래스’ 입니다. 이 클래스와 외부 클래스가 밀접한 관련이 있거나, 그 밖의 다른 클래스와 협력할 일이 없는 경우 내부 클래스로 선언해서 사용합니다.
인스턴스 내부 클래스는 인스턴스 변수를 선언할 때와 같은 위치에 선언하며, 외부 클래스 내부에서만 생성하여 사용하는 객체를 선언할 때 씁니다. 외부클래스가 먼저 생성되어야 사용할 수 있고, 인스턴스 내부 클래스의 메소드는 외부 클래스의 메소드가 호출될 때 사용 가능 합니다.
class OutClass { //외부클래스 private int num = 10; //외부클래스 private 변수 private static int sNum = 20; //외부클래스 정적변수 private InClass inClass; //내부클래스 자료형 변수 먼저 선언 public OutClass(){ inClass = new InClass(); //외부클래스 생성자. } class InClass{ //인스턴스 내부 클래스 int inNum = 100; //내부클래스의 인스턴스 변수 static int sInNum = 200; void inTest(){ System.out.println("OutClass num = " +num + "(외부 클래스의 인스턴스 변수)"); System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수)"); } static void sTest(){ //인스턴스내부클래스에 정적메소드 정의 불가 } }
해당 코드에서 InCalss의 static int sInNum = 200; 는 인스턴스 내부클래스로 해당 클래스에서는 정적 변수를 선언할 수가 없다.
인스턴스 내부 클래스는 인스턴스 변수를 선언할 때와 같은 위치에 선언하며, 외부 클래스 내부에서만 생성하여 사용하는 객체를 선언할 때 씁니다. 외부클래스가 먼저 생성되어야 사용할 수 있고, 인스턴스 내부 클래스의 메소드는 외부 클래스의 메소드가 호출될 때 사용 가능 합니다.
class OutClass { private int num = 10; private static int sNum = 20; static class InStaticClass { //정적내부 클래스 int inNum = 100; //정적내부클래스의 인스턴스변수 static int sInNum = 200; //정적내부클래스의 정적변수 void inTest(){ //정적내부클래스의 일반 메서드 num += 10; System.out.println("InStaticClass inNum = " + inNum + "(내부 클래스의 인스턴스 변수 사용)"); System.out.println("InStaticClass sInNum = " + sInNum + "(내부 클래스의 스태틱 변수 사용)"); System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수 사용)"); } static void sTest(){ // 정적내부클래스의 static 메서드 num += 10; inNum += 10; System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수 사용)"); System.out.println("InStaticClass sInNum = " + sInNum + "(내부 클래스의 스태틱 변수 사용)"); } } }
해당 코드에서 inTest() 와 sTest() 의 num, inNum 은 외부 클래스의 인스턴스 변수를 사용할 수 없으므로 사용할 수 없다.
정적 내부 클래스는 인스턴스 내부 클래스처럼 외부 클래스의 멤버변수와 같은 위치에 정의하며 static 예약어를 함께 사용합니다. 내부 클래스가 외부 클래스 생성과 무관하게 사용할 수 있어야 하고 정적 변수도 사용할 수 있어야 한다면 정적 내부 클래스를 사용하면 됩니다.
정적메소드에서는 인스턴스 변수를 사용할 수 없습니다. 따라서 정적 내부 클래스에서도 외부 클래스의 인스턴스 변수는 사용할 수 없습니다. 정적내부클래스에서 사용하는 메소드가 정적메소드인 경우, 외부클래스와 정적내부 클래스에 선언된 변수 중 정적 변수만 사용할 수 있습니다.
지역 내부 클래스
지역 내부 클래스는 지역 변수처럼 메소드 내부에 클래스를 정의하여 사용합니다. 따라서 이 클래스는 메소드 안에서만 사용할 수 있습니다.
class Outer{ int outNum = 100; static int sNum = 200; Runnable getRunnable(int i){ int num = 100; //지역변수 class MyRunnable implements Runnable{ //지역내부클래스 int localNum = 10; //지역내부클래스의 인스턴스변수 @Override public void run() { num = 200; //지역변수는 상수로 바뀜 i = 100; //매개 변수 역시 지역변수처럼 상수로 바뀜 System.out.println("i =" + i); System.out.println("num = " +num); System.out.println("localNum = " +localNum); System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)"); System.out.println("Outter.sNum = " + Outer.sNum + "(외부 클래스 정적 변수)"); } } return new MyRunnable(); } }
위의 코드에서는 override 된 내부 클래스에서 i와 num은 사용이 불가능하다. 그렇다면 사용은 어떤 방식으로 가능한지 확인해보겠다.
public class LocalInnerTest { public static void main(String[] args) { Outer out = new Outer(); //클래스 생성 Runnable runner = out.getRunnable(10); //메소드 호출 runner.run(); } }
내부 클래스를 직접 호출하는 것이 아니라 getRunnable() 메소드 호출을 통해 생성된 객체를 반환 받습니다.
익명 클래스
class Outer{ Runnable getRunnable(int i){ int num = 100; return new Runnable() { //익명 내부 클래스. Runnable 인터페이스 생성 //마이러너블 클래스 이름을 빼고 클래스를 바로 생성 public void run() { System.out.println(i); System.out.println(num); } }; // 클래스의 끝에 세미콜론을 사용함. } Runnable runner = new Runnable() { //익명 내부 클래스를 변수에 대입 public void run() { System.out.println("Runnable 이 구현된 익명 클래스 변수"); } //인터페이스나 추상클래스형 변수를 선언하고 클래스를 생성해 대입하는 방법 }; //클래스의 끝에 세미콜론을 사용함. }
익명 클래스는 이름을 사용하지 않는 클래스이며, 위의 두가지 방법으로 사용할 수 있습니다.
public class AnonymousInnerTest { public static void main(String[] args) { Outer out = new Outer(); Runnable runner = out.getRunnable(10); //메소드 호출 runner.run(); out.runner.run(); } }
사용 방법은 지역 내부 클래스와 동일한 방법으로 사용이 가능합니다.
각각의 예제 코드를 다음의 링크에서 확인할 수 있습니다.
>>JAVA_외부 클래스 (OutClass, InClass) (tistory.com)
>> 깃허브 (OutClass, InnerTest)
>> Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09 (github.com)
GitHub - Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09
2021-08-09. Contribute to Kminseokk/KTDS_EDU_0809_JAVA development by creating an account on GitHub.
github.com
>>JAVA_정적 내부 클래스 예제 (static class) (tistory.com)
>> 깃허브 (OutClass2, InnerTest2)
>> Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09 (github.com)
GitHub - Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09
2021-08-09. Contribute to Kminseokk/KTDS_EDU_0809_JAVA development by creating an account on GitHub.
github.com
>>JAVA_지역 내부 클래스 예제 (Outer(), Runnable()) (tistory.com)
>> 깃허브 (Outer, LocalInnerTest)
>> Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09 (github.com)
GitHub - Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09
2021-08-09. Contribute to Kminseokk/KTDS_EDU_0809_JAVA development by creating an account on GitHub.
github.com
>>JAVA_익명클래스 예제 (getRnnable(), AnonymousInnerTest()) (tistory.com)
>> 깃허브 (AnonymousInnerTest, Outer2)
>> Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09 (github.com)
GitHub - Kminseokk/KTDS_EDU_0809_JAVA: 2021-08-09
2021-08-09. Contribute to Kminseokk/KTDS_EDU_0809_JAVA development by creating an account on GitHub.
github.com
안녕하세요 말하는 고구마 입니다.
'KT_DS' 카테고리의 다른 글
KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_15일차(JAVA), 자바 파트 마지막. (0) 2021.08.11 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_14일차(JAVA) (0) 2021.08.10 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_12일차(JAVA) (0) 2021.08.06 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_11일차(JAVA) (0) 2021.08.05 KTDS_자바&파이썬 웹애플리케이션전문가 양성과정교육_10일차(JAVA) (0) 2021.08.04 댓글 (비로그인 댓글 허용하지 않습니다.)