1. Collection
|__ List
|__ ArrayList, LinkedList
2. Collection
|__ Set
|__ HashSet, TreeSet
3. Map<K, V>
|__ HashMap<K, V>, TreeMap<K, V>
[실습코드]
1. Lec19_String
1) com.lec.java.string02 패키지, String02Main 클래스
package com.lec.java.string02;
/* String 생성자, String literal(상수)
*/
public class String02Main {
public static void main(String[] args) {
System.out.println("String 생성자, literal(상수)");
int num1 = 1;
int num2 = 1;
if (num1 == num2) {
System.out.println("같은 숫자");
} else {
System.out.println("다른 숫자");
}
System.out.println();
System.out.println("[1] String literal 사용");
// "Hello"는 literal이기 때문에, 한 번 만들어지면 재사용됨
// 그래서, str1과 str2는 같은 곳(주소)에 있는 문자열 "Hello"를 가리키게 됨
// 즉, str1과 str2에는 같은 값이 저장되게 됨
// literal : 직접 입력 하는 값
String str1 = "Hello";
String str2 = "Hello";
// 주소를 비교한것..!!
if(str1 == str2) {
System.out.println("동일한 곳(문자열 ) 참조");
} else {
System.out.println("다른 곳(문자열) 참조");
}
// 위의 값이 참이 나온 이유
// 동일한 리터럴은 중복되서 발생하지 않음
// 중복되서 만들어지면 메모리 낭비야 ㅜㅜ
System.out.println();
System.out.println("[2] String 생성자 사용");
// 생성자는 호출될 때마다 새로운 인스턴스를 힙에 생성하게 됨
// str3과 str4는 서로 다른 인스턴스를 가리키게 됨
// 즉, str3과 str4에는 서로 다른 값이 저장되게 됨
String str3 = new String("Hello");
String str4 = new String("Hello");
if(str3 == str4) {
System.out.println("동일한 곳(문자열 ) 참조");
} else {
System.out.println("다른 곳(문자열) 참조");
}
System.out.println();
System.out.println("[2-2] String intern() 결과 비교");
// intern() String 객체가 실제로 참조하는 문자열 리턴
System.out.println("\nstr3.intern() == str4.intern()");
if(str3.intern() == str4.intern()) {
System.out.println("intern() 동일한(문자열) 참조");
} else {
System.out.println("intern() 다른 곳(문자열) 참조");
}
System.out.println("\nstr1.intern() == str2.intern()");
if(str1.intern() == str2.intern()) {
System.out.println("intern() 동일한(문자열) 참조");
} else {
System.out.println("intern() 다른 곳(문자열) 참조");
}
System.out.println("\nstr1.intern() == str4.intern()");
if(str1.intern() == str4.intern()) {
System.out.println("intern() 동일한 (문자열) 참조");
} else {
System.out.println("intern() 다른 곳 (문자열) 참조");
}
// == 연산자는 실제 문자열이 같은 지 다른 지를 비교하는 것이 아니고,
// 참조 변수(지역 변수) str3과 str4에 저장된 값(주소)가 같은 지 다른 지를 비교하는 것임.
// 문자열 비교를 == 으로 하지 말것!!!!
System.out.println();
System.out.println("[3] String equals() 메소드");
// 문자열 비교는 equals() 사용하자. 참고로 equals() 는 Object 의 메소드다.
// 실제 안에 있는 값을 동일한지 하나 하나 비교함
if(str3.equals(str4)) {
System.out.println("equals() 같은 문자열");
} else {
System.out.println("equals() 다른 문자열");
}
System.out.println();
System.out.println("[4] String compareTo() 메소드");
// compareTo() 는 두 문자열의 문자코드량 의 비교
// (lexicographical comparison based on the Unicode value)
// 이경우 유니코드 값을 비교하게 됨.
System.out.println("compareTo(): " + str3.compareTo(str4));
String str5 = "A";
String str6 = "C";
// 출력값 : A - C = -2
System.out.println("compareTo(): " + str5.compareTo(str6));
// 출력값 : C - A = 2
System.out.println("compareTo(): " + str6.compareTo(str5));
System.out.println();
str5 = "AaAa";
str6 = "aAaA";
System.out.println("compareTo(): " + str5.compareTo(str6));
System.out.println("compareTo(): " + str6.compareTo(str5));
System.out.println();
str5 = "xaAa";
str6 = "xAaA";
System.out.println("compareTo(): " + str5.compareTo(str6));
System.out.println("compareTo(): " + str6.compareTo(str5));
System.out.println("\n프로그램 종료");
} // end main()
} // end class
2) com.lec.java.string03 패키지, String03Main 클래스
package com.lec.java.string03;
/* StringBuffer, StringBuilder
String 클래스는 immutable 클래스이고,
StringBuffer, StringBuilder는 mutable 클래스임
StringBuffer:
Java ver 1.0부터 있던 클래스
쓰레드에 안전(thread-safe), 속도가 느림
StringBuilder:
Java 5부터 생긴 클래스
쓰레드에 안전하지 않다(thread-unsafe), 속도가 빠름.
그 외에는 StringBuffer와 StringBuilder는 같은 기능(메소드)을 갖고 있음
** 웹 프로그래밍 등에선 문자열을 '붙여 나가며' 완성하는 동작을 많이 함
실무에서는
String 을 concat() (혹은 + 연산)하기 보다는
StringBuffer 를 append() 하는 것을 더 많이 사용함 (성능 UP)
※ 그러나 학습예제에선 예제단순화를 위해 String 을 기본적으로 사용하니 참조 바랍니다
*/
public class String03Main {
// immutable : 변할 수 없는
// mutable : 변할 수 있는
public static void main(String[] args) {
System.out.println("[1] StringBuffer, StringBuilder");
// String 클래스는 immutable 클래스이고,
// StringBuffer, StringBuilder는 mutable 클래스임
System.out.println("[String: immutable]");
String str1 = "Hello";
String str2 = str1;
System.out.println("str1 = " + str1);
System.out.println("str2 = " + str2);
// 출력 값 : "== 동일 참조"
if(str1 == str2) {
System.out.println("== 동일 참조");
} else {
System.out.println("== 다른 참조");
}
System.out.println(str1.concat("Java"));
System.out.println(str1); // str1이 실제로 변경되지 않는다. immutable...!!!
// Heap에 저장된 [Hello Java] 값의 주소 값이 str1에 저장된다..!!
str1 = str1.concat("Java");
System.out.println(str1);
// 출력 값 : == 다른 참조
if(str1 == str2) {
System.out.println("== 동일 참조");
} else {
System.out.println("== 다른 참조");
}
System.out.println();
System.out.println("[StringBuffer: mutable]");
StringBuffer buff1 = new StringBuffer("Hello");
StringBuffer buff2 = buff1;
System.out.println("buff1 = " + buff1);
System.out.println("buff2 = " + buff2);
// 주소 비교한 거
if(buff1 == buff2) {
System.out.println("== 동일 참조");
} else {
System.out.println("== 다른 참조");
}
System.out.println(buff1.append("Java"));
System.out.println(buff1); // buff1 값이 변경됨...!!! 이게 바로 mutable...!!!
if(buff1 == buff2) {
System.out.println("== 동일 참조");
} else {
System.out.println("== 다른 참조");
}
// 심지어 buff2도 값이 변경됬다...!!
// 왜? 같은 곳을 레퍼런싱을 하고 있기 때문이다.
System.out.println(buff2);
// 성능은 StringBuffer가 더 좋음
// 왜냐하면 StringBuffer는 append를 이용하여 직접 값을 변경하면 되지만
// String은 concat을 이용하여 새롭게 만드는 과정이 필요하기 때문에 시간이 필요함
// 그렇기 때문에 주로 실무에서는 StringBuffer를 더 많이 사용함
// StringBuffer:
// Java ver 1.0부터 있던 클래스
// 쓰레드에 안전(thread-safe), 속도가 느림
// StringBuilder:
// Java 5부터 생긴 클래스
// 쓰레드에 안전하지 않다(thread-unsafe), 속도가 빠름.
// 그 외에는 StringBuffer와 StringBuilder는 같은 기능을 갖고 있음
System.out.println();
StringBuilder buff3 = new StringBuilder("Hello");
System.out.println(buff3.append("Java"));
System.out.println("\n프로그램 종료");
} // end main()
} // end class
2. Lec21_Wrapper
1) com.lec.java.wrapper01 패키지, Wrapper01Main 클래스
package com.lec.java.wrapper01;
/* Wrapper 클래스: 기본 자료형(primitive type)의 데이터를 감싸는 클래스
* 기본 자료형: boolean, char, byte, short, int, long, float, double
* Wrapper: Boolean, Character, Byte, Short, Integer, Long, Float, Double
*
* Wrapper 클래스는 immutable 하다!
*
*/
// 자바 세상에서는...!! final 대문자, static 기울림, 파란색은 멤버 변수
public class Wrapper01Main {
public static void main(String[] args) {
System.out.println("Wrapper 클래스");
System.out.println("wrapper 클래스에 값을 저장하는 방법");
System.out.println();
Integer i1 = 100; // reference <= primitive ?!?!?
// 호에에에!??!? 둘이 타입이 다른데 어캐 대입된거지??
i1 = i1 + 200; // 호에에에..!!! reference 가 산술연산을!?!?!?!?
System.out.println("i1 = " + i1); // 300
// Wrapper 클래스는 마치 primitive 타입처럼 동작한다!
// 1. 생성자 이용
Integer num1 = new Integer(123);
System.out.println("num1 = " + num1);
// 2. wrapper 클래스의 static 메소드인 valueOf() 메소드를 사용
Integer num2 = Integer.valueOf(123);
System.out.println("num2 = " + num2);
// == 로 비교해보면 다르다고 나옴
if(num1 == num2) {
System.out.println("== 같다");
} else {
System.out.println("== 다르다!");
}
// equals()로 비교해보면 같다고 나옴
if(num1.equals(num2)) {
System.out.println("== 같다");
} else {
System.out.println("== 다르다");
}
// 3. new Integer() VS Integer.valueOf()
Integer num3 = new Integer(123); // new 는 새로운 instance 생성
Integer num4 = Integer.valueOf(123);
// valueOf()는 생성한 Object 를 cache(캐시) 해둔다.
// 동일 literal 로 valueOf() 생성하면, 기존의 생성된 Object 리턴
// 왜..?? 메모리 절약을 위해...!!!
// new 로 생성한 것들끼리 비교
if(num1 == num3) {
System.out.println("생성자: 같은 참조");
} else {
System.out.println("생성자: 다른 참조");
}
// valueOf() 로 생성한 것들끼리 비교
if(num2 == num4) {
System.out.println("valueOf(): 같은 참조");
} else {
System.out.println("valueof(): 다른 참조");
}
// 4. literal 상수로 생성
System.out.println();
Integer num5 = 123;
// Integer.valueOf(123) 과 동일한 코드가 동작됨! (Auto-Boxing)
if(num4 == num5) {
System.out.println("literal 같은 참조");
} else {
System.out.println("literal 다른 참조");
}
// 5. valueOf(문자열) 가능!
Integer num6 = Integer.valueOf("123");
System.out.println(num6);
if(num6 == num5) {
System.out.println("같은 참조");
} else {
System.out.println("다른 참조");
}
// 6. 산술 연산 가능
num6 *= 2; // Wrapper 의 연산 결과는 새로운 Wrapper 생성(immutable!)
System.out.println(num6);
if(num6 == num5) {
System.out.println("같은 참조");
} else {
System.out.println("다른 참조"); // 다르다! Wrapper 는 immutable 하다!
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class
2) com.lec.java.wrapper02 패키지, Wrapper02Main 클래스
package com.lec.java.wrapper02;
/* Java 5부터 wrapper 클래스의 auto-boxing/unboxing 기능 제공
* boxing(포장): 기본자료형의 값을 wrapper 클래스에 저장하는 것
* unboxing(개봉): wrapper 클래스에 저장된 기본자료형 값을 꺼내는 것
*/
public class Wrapper02Main {
public static void main(String[] args) {
System.out.println("auto-boxing, auto-unboxing");
// auto-boxing : 말하지 않아도 자동으로 포장해서 넣어준다는 뜻...!!
Integer num1 = 10; // Integer.valueOf(10); <-- auto-boxing
Integer num2 = 20;
// auto-unboxing : 말하지 않아도 자동으로 안에 있는 것을 꺼내준다는 뜻...!
System.out.println(num1 + num2); // auto-unboxing!
System.out.println(num1.intValue() + num2.intValue()); // <-- 이와 같이 동작
// 연산을 위해 auto-unboxing을 하고 값을 저장하기 위해 auto-boxing을 한다.
Integer num3 = num1 + num2;
// 아래와 같이 동작한다
Integer num30 = Integer.valueOf(num1.intValue() + num2.intValue());
System.out.println();
System.out.println("boxing/unboxing");
// boxing(포장): 기본자료형의 값을 wrapper 클래스에 저장하는 것
// unboxing(개봉): wrapper 클래스에 저장된 기본자료형 값을 꺼내는 것
Integer num4 = 100; // Integer.valueOf(100);
int n4 = num4; // num4.intValue();
System.out.println("n4 = " + n4);
System.out.println();
System.out.println("auto-boxing/auto-unboxing");
System.out.println();
System.out.println("wrapper 클래스들");
Long num100 = Long.valueOf(100000000000000L);
Long num101 = 100000000000000L;
double num200 = 3.14; // Double.valueOf(3.14)
System.out.println(num1.intValue());
System.out.println(num1.doubleValue()); // unboxing 은 원하는 타입으로 가능
System.out.println("\n프로그램 종료");
} // end main()
} // end class
3) com.lec.java.wrapper05 패키지, Wrapper05Main 클래스
package com.lec.java.wrapper05;
/* Wrapper 클래스의 유용성
* 1. Object 타입이 모~든 (심지어 primitive) 타입도 받을수 있다.
* 2. Collection 과 같은 Generic 클래스에선
* primitive 타입을 담을수 없다. 그러나 ,Wrapper 를 통해 가능하다.
*/
public class Wrapper05Main {
public static void main(String[] args) {
System.out.println("Wrapper 클래스의 유용성");
Object[] obj = new Object[5];
obj[0] = new Wrapper05Main();
obj[1] = new A();
obj[2] = new A2();
obj[3] = new B();
obj[4] = 123; // 호에에..!! Object 가 primitive type도 받을 수 있다...?!?!? 가능..!!
// 왜? Auto-Boxing + Polymorphism(다형성)
// Object <-- Integer <-- int
for(Object e : obj) {
System.out.println(e);
// Wrapper 는 자동적으로 Auto-unboxing 발생
}
System.out.println();
// 실타입이 Object 이면
// auto-unboxing 등이 필요한 연산식에서는 '형변환' 해주어야 동작한다.
//int num = obj[4] * 3; // 에러
// The operator * is undefined for the argument type(s) Object, int
int num = (Integer)obj[4] * 3;
System.out.println("\n프로그램 종료");
} // end main()
} // end class
class A{}
class A2 extends A{}
class B{}
3. Lec22_Collection
1) com.lec.java.generic01 패키지, Generic01Main 클래스
package com.lec.java.generic01;
/* Generic 클래스:
* 클래스의 멤버변수나 혹은 메소드의 리턴'타입', 매개변수 등의 '타입'을
* 지정하지 않고 generic(일반적으로)하게 정의하는 클래스
*
* '동작' 은 같으나, '데이터 타입' 만 다른 경우 Generic 으로 설계함으로 코드 생산성 향상
*/
public class Generic01Main {
public static void main(String[] args) {
System.out.println("Generics(제네릭스)");
System.out.println();
System.out.println("[1] generic 클래스 사용 전");
Orange orange1 = new Orange(10);
OrangeBox orangeBox1 = new OrangeBox(orange1);
orangeBox1.pullOut().displaySugar();
Apple a1 = new Apple(100);
AppleBox applebox1 = new AppleBox(a1);
applebox1.pullout().displayWeight();
// 동작은 pullOut() 으로 같음에도 불구하고,
// 다루는 데이터가 다르다는 이유로 클래스를 매 데이터마다 정의하는 것은 매우 비효율
// 그래서 자바에서는 generic 클래스를 제공
System.out.println();
System.out.println("[2] generic 클래스 사용");
Orange orange2 = new Orange(100);
FruitBox<Orange> orangeBox2 = new FruitBox<Orange>(orange2);
orangeBox2.pullOut().displaySugar();
// 사과, 바나나를 각각 담는 FruitBox 생성하고 pullOut 해보기
Apple a2 = new Apple(200);
FruitBox<Apple> appleBox2 = new FruitBox<Apple>(a2);
appleBox2.pullOut().displayWeight();
Banana b2 = new Banana(300);
FruitBox<Banana> bananaBox2 = new FruitBox<Banana>(b2);
bananaBox2.pullOut().displayNum();
System.out.println("\n프로그램 종료");
} // end main()
} // end class
//---------------------------------------------
// '과일' 클래스들 정의
class Banana{
int num;
public Banana() {}
public Banana(int num) {this.num = num;}
public void displayNum() {
System.out.println("바나나 송이개수: " + num);
}
} // end class Banana
class Orange{
int sugar;
public Orange() {}
public Orange(int sugar) {this.sugar = sugar;}
public void displaySugar() {
System.out.println("오렌지 당도: " + sugar);
}
} // end class Orange
class Apple{
int weight;
public Apple() {}
public Apple(int weight) {this.weight = weight;}
public void displayWeight() {
System.out.println("사과 무게: " + weight);
}
} // end class Apple
//------------------------------------------
// 위 과일 들을 담을 box 클래스들 정의
class BananaBox {
Banana banana;
public BananaBox() {}
public BananaBox(Banana banana) {this.banana = banana;}
public Banana pullOut() {return banana;}
}
class OrangeBox{
Orange orange;
public OrangeBox() {}
public OrangeBox(Orange orange) {this.orange = orange;}
public Orange pullOut() {return orange;}
}
class AppleBox {
Apple apple;
public AppleBox() {}
public AppleBox(Apple apple) {this.apple = apple;}
public Apple pullout() {return apple;}
}
// Generic 클래스:
// 클래스의 멤버변수나 혹은 메소드의 리턴'타입', 매개변수 등의 '타입'을
// 지정하지 않고 generic(일반적으로)하게 정의하는 클래스
// < > 안에 타입매개변수 (type parameter) 지정
class FruitBox<T> {
T fruit; // T 타입
public FruitBox() {}
public FruitBox(T fruit) {this.fruit = fruit;}
public T pullOut() {return this.fruit;} // T 타입 리턴
}
2) com.lec.java.generic02 패키지, Generic02Main 클래스
package com.lec.java.generic02;
/* 제네릭 클래스의 타입
* 제네릭 클래스에서 사용되는 타입은
* 기본 자료형(primitive type)은 사용될 수 없고,
* Object 타입의 자료형들만 올 수 있음.
* (예) int는 사용할 수 없고, Integer를 사용해야 함
* (예) double은 사용할 수 없고, Double을 사용해야 함
*/
public class Generic02Main {
public static void main(String[] args) {
System.out.println("Generic 클래스 2");
Test<Integer, String> t1 = new Test<Integer, String>(123, "Hello, Java1");
t1.display();
System.out.println();
Test<Integer, Double> t2 = new Test<Integer, Double>(111, 3.14);
t2.display();
System.out.println("\n프로그램 종료");
} // end main
} // end class Collection02Main
class Test<T, U> {
T item1;
U item2;
public Test(T item1, U item2) {
this.item1 = item1;
this.item2 = item2;
}
public void display() {
System.out.println("item1: " + item1);
System.out.println("item2: " + item2);
}
}
3) com.lec.java.collection01 패키지, Collection01Main 클래스
package com.lec.java.collection01;
import java.util.ArrayList;
import java.util.Iterator;
/* ArrayList<E>
※계층도 숙지 중요
Collection<E>
|__ List<E>
|__ ArrayList<E>, LinkedList<E>
List 특징(ArrayList와 LinkedList의 공통점)
1. 중복 저장 허용
2. 저장 순서 유지 (인덱스 존재)
ArrayList:
1. 저장 용량을 늘리는 데 많은 시간 소요 - 단점
2. 데이터를 삭제하는 데 많은 연산 - 단점
3. 데이터 참조 매우 빠름 - 장점
LinkedList:
1. 저장 용량을 늘리는 과정이 매우 간단 - 장점
2. 데이터를 삭제하는 과정이 간단 - 장점
3. 데이터 참조가 불편 - 단점
※ Vector<E> <-- ArrayList 와 비슷하나... ArrayList 추천.
*/
public class Collection01Main {
public static void main(String[] args) {
System.out.println("ArrayList<E>");
// ArrayList 선언 - ArrayList 인스턴스 생성
ArrayList<Integer> list1 = new ArrayList<Integer>();
// 데이터 추가(저장): add(element) 메소드 사용
// add(idnex, element) -> index 번째 삽입
list1.add(100);
list1.add(400);
list1.add(500);
list1.add(200);
list1.add(400);
list1.add(2, 700); // index 2 위치에 삽입
// 데이터 참조(읽기, 검색): get(index) 메소드 사용
// size(): ArrayList의 크기를 반환(리턴)
System.out.println("size() : " + list1.size());
for(int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i));
}
// 데이터 삭제: remove(index) 메소드 사용
list1.remove(3);
System.out.println("삭제 후");
for(int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i));
}
// 데이터 수정: set(index, element) 메소드 사용
list1.set(2, 333);
System.out.println("수정후");
for(int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i));
}
// ArrayList 출력 방법
// 1) for
// 2) Enhanced-for 사용
// 3) Iterator(반복자) 사용
// 4) forEach() 사용
System.out.println("Enhanced for를 사용한 출력");
// Enhanced for 사용 가능
for(Integer e : list1) {
System.out.println(e);
}
System.out.println("Iterator 를 사용한 출력");
// Iterator(반복자) 사용법
// iterator() 메소드를 사용해서 인스턴스 생성
Iterator<Integer> itr = list1.iterator();
// hasNext(): iterator가 다음 원소를 가지고 있는 지(true/false)
// next(): 현재 iterator 위치의 원소를 값을 리턴하고,
// iterator의 위치를 다음 원소의 위치로 변경
while(itr.hasNext()) {
System.out.println(itr.next());
}
System.out.println("forEach() 를 사용한 출력");
// forEach() + functional interface
// Java8 부터 등장
list1.forEach(System.out::println);
System.out.println("\n프로그램 종료");
} // end main
} // end class
4) com.lec.java.collection03 패키지, Collection03Main, Score, Student 클래스
** Collection03Main 클래스
package com.lec.java.collection03;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Collection03Main {
public static void main(String[] args) {
System.out.println("ArrayList 연습");
// Student 타입을 담는 ArrayList를 만드고
// 사용자로부터 3개의 Student 데이터 을 입력받아서
// (id, name, kor, eng, math)
// 3가지 방법으로 출력해보세요.
// for, Enhanced-for, Iterator
ArrayList<Student> list = new ArrayList<Student>();
Scanner sc = new Scanner(System.in);
for(int i = 0; i < 3; i++) {
System.out.print("아이디를 입력하세요 : ");
int id = sc.nextInt();
sc.nextLine();
System.out.print("이름을 입력하세요 : ");
String name = sc.nextLine();
System.out.print("국어, 영어, 수학: ");
int kor = sc.nextInt();
int eng = sc.nextInt();
int math = sc.nextInt();
Student stu = new Student(id, name, new Score(kor, eng, math));
list.add(stu);
}
// 1) for
System.out.println("\n1) for");
for(int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
// 2) Enhanced-for
System.out.println("\n2) Enhanced-for");
for(Student e : list) {
System.out.print(e);
}
// 3) Iterator
System.out.println("\n3) Iterator");
Iterator<Student> itr = list.iterator();
while(itr.hasNext()) {
System.out.print(itr.next());
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class
** Score 클래스
package com.lec.java.collection03;
public class Score {
private int korean;
private int english;
private int math;
public Score() {}
public Score(int kor, int eng, int math) {
this.korean = kor;
this.english = eng;
this.math = math;
}
public int getKorean() {
return korean;
}
public void setKorean(int korean) {
this.korean = korean;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
} // end class Score
** Student 클래스
package com.lec.java.collection03;
public class Student {
private int id;
private String name;
private Score score;
public Student() {}
public Student(int id, String name, Score s) {
this.id = id;
this.name = name;
this.score = s;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Score getScore() {
return score;
}
public void setScore(Score score) {
this.score = score;
}
// com.lec.java.colleciton07 이후
@Override
public String toString() {
String str = "";
str += "id:" + id + "\t";
str += "name:" + name + "\t";;
str += "국어:" + score.getKorean() + "\t";
str += "영어:" + score.getEnglish() + "\t";
str += "수학:" + score.getMath() + "\n";
return str;
}
public static void printTotal(Student stu){
System.out.println("id:" + stu.getId());
System.out.println("이름:" + stu.getName());
System.out.println("총점:" + (stu.getScore().getEnglish() + stu.getScore().getKorean() + stu.getScore().getMath()));
}
} // end class Student
5) com.lec.java.collection04 패키지, Collection04Main, MemberModel 클래스
** Collection04Main 클래스
package com.lec.java.collection04;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class Collection04Main {
public static void main(String[] args) {
System.out.println("ArrayList 연습");
// MemberModel 타입을 담는 ArrayList를 만들고
// 사용자로부터 3개의 Student 데이터를 입력받아서
// (id, passwd)
// 3가지 방법으로 출력해보세요
// for, Enhanced-for, Iterator
ArrayList<MemberModel> list = new ArrayList<MemberModel>();
Scanner sc = new Scanner(System.in);
for(int i = 0; i < 3; i++) {
System.out.print("아이디를 입력하세요 : ");
String id = sc.nextLine();
System.out.print("패스워드를 입력하세요 : ");
String pw = sc.nextLine();
MemberModel model = new MemberModel(id, pw);
list.add(model);
}
sc.close();
// 1) Iterator
System.out.println("\n1) Iterator");
Iterator<MemberModel> itr = list.iterator();
while(itr.hasNext()) {
itr.next().displayInfo();
}
// 2) Enhanced-for
System.out.println("\n2) Enhanced-for");
for(MemberModel e : list) {
e.displayInfo();
}
// 3) for
System.out.println("\n3) for");
for(int i = 0; i < list.size(); i++) {
list.get(i).displayInfo();
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class
** MemberModel 클래스
package com.lec.java.collection04;
public class MemberModel {
private String id;
private String passwd;
public MemberModel() {}
public MemberModel(String id, String pw) {
this.id = id;
this.passwd = pw;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public void displayInfo() {
System.out.println("아이디: " + id);
System.out.println("비밀번호: " + passwd);
}
} // end class MemberModel
6) com.lec.java.collection05 패키지, Collection05Main 클래스
package com.lec.java.collection05;
import java.util.Iterator;
import java.util.LinkedList;
/* LinkedList
Collection<E>
|__ List<E>
|__ ArrayList<E>, LinkedList<E>
List:
1. 중복 저장 허용
2. 저장 순서 유지(인덱스 존재)
ArrayList:
1. 저장 용량을 늘리는 데 많은 시간 소요 - 단점
2. 데이터를 삭제하는 데 많은 연산 - 단점
3. 데이터 참조 매우 빠름 - 장점
LinkedList:
1. 저장 용량을 늘리는 과정이 매우 간단 - 장점
2. 데이터를 삭제하는 과정이 간단 - 장점
3. 데이터 참조가 불편 - 단점
※ 걍 ArrayList 쓰세요~~~
*/
public class Collection05Main {
public static void main(String[] args) {
System.out.println("Linked List");
// Integer 타입을 저장할 수 있는 LinkedList 인스턴스 생성
LinkedList<Integer> list = new LinkedList<Integer>();
// LinkedList에 데이터 저장: add()
list.add(100);
list.add(500);
list.add(300);
list.add(600);
list.add(800);
list.add(700);
System.out.println(list);
System.out.println();
// 검색: get()
System.out.println("list.get(4) : " + list.get(4));
System.out.println("list.get(0) : " + list.get(0));
System.out.println();
// 데이터 삭제: remove()
list.remove(4);
System.out.println(list);
System.out.println();
// 데이터 수정: set()
list.set(4, 800);
System.out.println(list);
System.out.println();
// Iterator 만들어서 데이터 출력
System.out.println("Iterator 사용");
Iterator<Integer> itr = list.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class
7) com.lec.java.collection06 패키지, Collection06Main 클래스
package com.lec.java.collection06;
import java.util.HashSet;
import java.util.Iterator;
/* Set, HashSet<E>
Collection<E>
|__ Set<E>
|__ HashSet<E>, TreeSet<E>
Set:
1. 자료의 중복 저장이 허용되지 않는다. (hashCode() 값의 중복여부!)
2. 저장 순서가 유지되지 않는다.(인덱스 없다.)
(예) {1, 2, 3} = {1, 1, 2, 2, 3} : 중복 저장이 안되기 때문에 같은 Set
(예) {1, 2, 3} = {1, 3, 2}: 저장 순서가 중요하지 않기 때문에 같은 Set
HashSet: 매우 빠른 검색 속도를 제공
(※ HashXXX ← '검색속도 향상'을 쓰는 자료구조 입니다)
*/
public class Collection06Main {
public static void main(String[] args) {
System.out.println("HashSet 클래스");
// Integer 타입을 저장할 수 있는 HashSet 인스턴스 생성
HashSet<Integer> set = new HashSet<Integer>();
// 데이터 저장: add()
// 성공하면 true, 실패하면 false를 리턴
set.add(100);
set.add(200);
set.add(300);
set.add(100);
set.add(400);
set.add(600);
set.add(1);
set.add(2);
System.out.println(set.add(100));
// HashSet의 크기: size()
System.out.println("HashSet 의 크기 : " + set.size());
// Set은 중복 저장을 허용하지 않는다.
// 데이터 검색:
// Set은 인덱스가 없기 때문에 get() 메소드를 제공하지 않습니다.
// 왜냐하면 순서가 없기 때문에...!!
// 데이터 검색을 위해서는 Iterator를 사용해야 함
System.out.println();
Iterator<Integer> itr = set.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
// 출력 결과, 저장순서와는 관계 없다.
}
// 데이터 삭제
// remove(element): Set에 있는 element를 찾아서 삭제
// element 있다면 삭제 후 true를 리턴
// element 없다면 false 리턴
System.out.println("삭제 결과 : " + set.remove(2)); // 데이터 2를 삭제함
// (2번째 삭제가 아니다!!)
System.out.println("삭제 결과 : " + set.remove(2));
System.out.println();
System.out.println("삭제 후:");
itr = set.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
// Iterator는 일회용이다..!!
//itr.next(); // 어떤 결과가 나올까?
// 에러 : java.util.NoSuchElementException
// Set 자료형 데이터 변경을 할 수 있는 set() 메소드를 제공하지 않습니다.
// 삭제(remove) 후 추가(add)하면 변경하는 효과
// 600 -> 777
set.remove(600);
set.add(777);
System.out.println("변경 후");
// enhanced-for 사용
System.out.println();
System.out.println("Enhanced for 사용 출력");
for(Integer x : set) {
System.out.println(x);
}
// forEach() 메소드 사용하여 출력 가능함
System.out.println("\n프로그램 종료");
} // end main()
} // end class
8) com.lec.java.collection07 패키지, Collection07Main 클래스
package com.lec.java.collection07;
import java.util.HashSet;
import java.util.Iterator;
public class Collection07Main {
public static void main(String[] args) {
System.out.println("HashSet 연습");
// String 타입을 저장할 수 있는 HashSet 를 생성하고
// 5개 이상의 데이터는 저장, 수정, 삭제 등의 동작을 해보고,
// iterator, enhanced-for 문을 사용해서 출력해보기
// String 타입을 저장할 수 있는 HashSet 인스턴스 생성
HashSet<String> set = new HashSet<String>();
// 데이터 저장
System.out.println(set.add("안녕"));
set.add("하세요");
set.add("배고파");
set.add("자고싶다");
set.add("웃기다");
set.add("치킨먹고싶다");
set.add("방가방가");
System.out.println();
System.out.println("데이터 저장");
System.out.println("데이터 개수 : " + set.size());
System.out.println();
System.out.println(set);
System.out.println();
// 데이터 삭제
set.remove("하세요");
set.remove("자고싶다");
System.out.println("삭제 후");
System.out.println(set);
// 1) iterator
System.out.println("\n1) iterator");
Iterator<String> itr = set.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
// 2) enhanced-for
// enhanced for는 인덱스가 필요 없는 for문이기 때문에
// set 타입의 자료형에서도 사용 가능
System.out.println("\n2) enhanced-for");
for(String e : set) {
System.out.println(e);
}
System.out.println("\n프로그램 종료");
} // end main()
} // end class
9) com.lec.java.collection08 패키지, Collection08Main, MyClass 클래스
** Collection08Main 클래스
package com.lec.java.collection08;
import java.util.HashSet;
import java.util.Iterator;
public class Collection08Main {
public static void main(String[] args) {
System.out.println("HashSet 연습");
// MyClass 타입을 저장할 수 있는 HashSet 인스턴스 생성
// 데이터 3개 이상 저장해보고 iterator, enahnce-for 등을
// 사용하여 출력해보기
HashSet<MyClass> hset = new HashSet<MyClass>();
// 데이터 3개 저장
MyClass mc1 = new MyClass(1, "Abc");
MyClass mc2 = new MyClass(2, "Def");
MyClass mc3 = new MyClass(1, "ABC");
hset.add(mc1);
hset.add(mc2);
hset.add(mc3);
System.out.println("size = " + hset.size());
// 검색: Iterator, enhanced for
System.out.println();
System.out.println("Iterator");
Iterator<MyClass> itr = hset.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
} // end while
System.out.println();
System.out.println("enhanced for");
for(MyClass e : hset) {
e.displayInfo();
}
// String toString() 오버라이딩 재정의
System.out.println();
System.out.println(hset);
System.out.println("\n프로그램 종료");
} // end main()
} // end class
** MyClass 클래스
package com.lec.java.collection08;
// Set 에서 같은지 다른지, 식별 가능하려면
// hashCode 와 equals 가 오버라이딩 되어야 한다
// hashCode() 값이 같고 equals() 결과가 true 이어야만 같은 객체로 판정한다.
public class MyClass {
private int id;
private String name;
public MyClass() {}
public MyClass(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void displayInfo() {
System.out.println("학번: " + id);
System.out.println("이름: " + name);
}
@Override
public String toString() {
return "학번: " + id + "\n" + "이름: " + name + "\n";
}
@Override
public boolean equals(Object obj) {
MyClass other = (MyClass)obj;
// 대소문자 구분
//boolean result = (this.id == other.id) && (this.name.equals(other.name));
// 대소문자 구분 안함
boolean result = (this.id == other.id) && (this.name.equalsIgnoreCase(other.name));
return result;
}
@Override
public int hashCode() {
return this.id;
}
} // end class MyClass
10) com.lec.java.collection09 패키지, Collection09Main 클래스
package com.lec.java.collection09;
import java.util.Iterator;
import java.util.TreeSet;
/* TreeSet
Collection<E>
|__ Set<E>
|__ HashSet<E>, TreeSet<E>
TreeSet: 데이터가 정렬된 상태로 저장(오름차순, 내림차순)
(※ TreeXXX ← 주로 '정렬'에 특화된 자료구조 입니다)
*/
public class Collection09Main {
public static void main(String[] args) {
System.out.println("TreeSet 클래스");
// Integer 타입을 저장할 수 있는 TreeSet 인스턴스 생성
TreeSet<Integer> tset = new TreeSet<Integer>();
// 데이터 저장 : add()
tset.add(11);
tset.add(2);
tset.add(14);
tset.add(1);
tset.add(7);
tset.add(15);
tset.add(5);
tset.add(8);
// 데이터 검색 - Iterator 사용
// TreeSet인 경우에 iterator() 메소드 오름차순 정렬
System.out.println("오름차순:");
Iterator<Integer> itr = tset.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
System.out.println();
System.out.println("내림차순:");
// 내림차순 Iterator : descendingIterator() 사용
Iterator<Integer> itr2 = tset.descendingIterator();
while(itr2.hasNext()) {
System.out.println(itr2.next());
}
// enhanced for
System.out.println();
System.out.println("enhanced for");
for(Integer e : tset) {
System.out.println(e);
}
// subset() 메소드
// 시작값과 끝값을 매개변수로 받아, 그것을 범위로, 부분 set 추출
System.out.println("\nsubSet()");
TreeSet<Integer> subSet = (TreeSet<Integer>)tset.subSet(5, 14);
// 5부터 시작해서 14전까지
// for(Integer e : subSet) {
// System.out.println(e);
// }
// toString이 오버라이딩되어 있어서 [5, 7, 8, 11]로 출력 가능함
System.out.println(subSet);
subSet = (TreeSet<Integer>)tset.subSet(5, true, 14, true);
// 5도 포함, 14도 포함한 범위
System.out.println(subSet);
subSet = (TreeSet<Integer>)tset.subSet(3, 10);
System.out.println(subSet);
System.out.println("\n프로그램 종료");
} // end main()
} // end class
11) com.lec.java.collection10 패키지, Collection10Main 클래스
package com.lec.java.collection10;
import java.util.Iterator;
import java.util.TreeSet;
public class Collection10Main {
public static void main(String[] args) {
System.out.println("TreeSet 연습");
// String 타입을 저장할 수 있는 TreeSet 인스턴스 생성
// 5개 이상의 데이터를 저장해보고
// 오름차순, 내림차순으로 출력해보기
TreeSet<String> tset = new TreeSet<String>();
// 데이터 저장
tset.add("안녕");
tset.add("자바공부");
tset.add("하고 있어");
tset.add("오늘도");
tset.add("알찬");
tset.add("수업시간이구나!");
tset.add("치킨 먹고 싶다ㅜ^ㅜ");
// 오름차순으로 출력하기 - Iterator
System.out.println("\n오름차순으로 출력");
Iterator<String> itr = tset.iterator();
while(itr.hasNext()) {
System.out.println(itr.next());
}
// 내림차순으로 출력하기
System.out.println("\n\n내림차순으로 출력");
Iterator<String> itr2 = tset.descendingIterator();
while(itr2.hasNext()) {
System.out.println(itr2.next());
}
System.out.println("\n프로그램 종료");
} // end main
} // end class
12) com.lec.java.collection11 패키지, Collection11Main 클래스
package com.lec.java.collection11;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
/* Map<K, V>, HashMap<K, V>
Collection<E>
|__ List<E>, Set<E>
List<E>
|__ ArrayList<E>, LinkedList<E>
Set<E>
|__ HashSet<E>, TreeSet<E>
Map<K, V>
|__ HashMap<K, V>, TreeMap<K, V>
검색, 정렬
Map: key-value 저장 방식의 자료 구조
1. key는 중복되지 않는 값만 허용
2. value는 같더라도 key 값이 다르면 저장 가능
3. 검색, 수정, 삭제를 할 때 key를 사용
*/
public class Collection11Main {
public static void main(String[] args) {
System.out.println("HashMap 클래스");
// HashMap 인스턴스 생성 : 검색에 특화
// Key - Integer 타입
// Value - String 타입
HashMap<Integer, String> hmap = new HashMap<Integer, String>();
// 데이터 저장: put() 메소드 사용
// 새로운 key 값이면 null 리턴
// 기존 key 값이면 기존의 값이 리턴
System.out.println(hmap.put(1, "장수영"));
System.out.println(hmap.put(2, "김광진"));
System.out.println(hmap.put(3, "주낙경"));
System.out.println(hmap.put(4, "정세헌"));
System.out.println(hmap.put(4, "조현주")); // "정세현" -> "조현주"
// 같은 키 값으로 데이터를 put하게 되면, 기존 값이 수정(replace)이 됨.
// 저장된 데이터 개수 확인 : size()
System.out.println("데이터 개수: " + hmap.size());
System.out.println();
// 데이터 읽기
// get(key) 사용해서 읽기
System.out.println(hmap.get(1));
System.out.println(hmap.get(2));
System.out.println(hmap.get(5)); // 없는 key값은 null 리턴
// 데이터 삭제
// remove(key) : 삭제된 value 리턴
System.out.println("삭제 : " + hmap.remove(2));
// 방법1 HashMap에서 Iterator 사용
// 1. HashMap의 keySet() 메소드를 사용해서
// 저장된 키(key)값들로만 이루어진 Set을 만듦.
// 2. 1에서 만들어진 Set에 있는 iterator() 메소드를 사용해서
// Iterator를 생성
Set<Integer> keySet = hmap.keySet();
Iterator<Integer> itr = keySet.iterator();
while(itr.hasNext()) {
int key = itr.next();
System.out.println(key + " : " + hmap.get(key));
}
// 초창기에 많이하는 실수
// 한줄로 실수하려고 아래와 같이 줄여서 사용하는데 절대 이렇게 사용하면 안됨
// 귀찮더라도 두줄로 나눠서 위의 코드와 같이 사용해야함..!!!
// 에러 : java.util.NoSuchElementException
// while(itr.hasNext()) {
// System.out.println(itr.next() + " : " + hmap.get(itr.next()));
// }
System.out.println();
// 방법2 : Map.Entry 사용
// entrySet() 은 Set<Entry<Integer, String>> 리턴함
for(Map.Entry<Integer, String> m : hmap.entrySet()) {
System.out.println(m.getKey() + " : " + m.getValue());
}
System.out.println();
// 도전과제
// arr[] = {2, 4, 5, 4, 3, 3, 4}
// 주어진 배열이 위와 같을때 다음과 같이 발생회수 나타내기
// 2 : 1개
// 3 : 2개
// 4 : 3개
// 5 : 1개
System.out.println("HashMap 응용: 배열에서 발생빈도 구하기");
int arr[] = {2, 4, 5, 4, 3, 3, 4, 5, 5, 5, 5, 4, 4, 4};
printFreq(arr);
System.out.println("\n프로그램 종료");
} // end main()
static void printFreq(int arr[]) {
HashMap<Integer, Integer> hmap = new HashMap<Integer, Integer>();
// 발생빈도
for (int i = 0; i < arr.length; i++) {
Integer v = hmap.get(arr[i]); //arr[i] 가 key
if(v == null) { // 기존에 해당하는 Key 값이 없었다면(즉! 첫등장이면)
hmap.put(arr[i], 1); // 등장횟수 1
} else { // 등장횟수 1 이상
hmap.put(arr[i], v + 1); // 기존 등장횟수에 +1 증가
}
}
// 결과출력
for(Map.Entry<Integer, Integer> e : hmap.entrySet()) {
System.out.println(e.getKey() + " : " + e.getValue() + "개");
}
}
} // end class
13) com.lec.java.collection12 패키지, Collection12Main 클래스
package com.lec.java.collection12;
import java.util.HashMap;
import java.util.Iterator;
import java.util.NavigableSet;
import java.util.Set;
import java.util.TreeMap;
// Hash: 검색을 빠르게 하기 위한 용도
// Tree: 데이터 정렬을 하기 위한 용도
public class Collection12Main {
public static void main(String[] args) {
System.out.println("TreeMap 클래스");
// TreeMap<Integer, String> 타입 인스턴스 생성
TreeMap<Integer, String> tmap = new TreeMap<Integer, String>();
// 데이터 저장: put(key, value) 메소드 사용
tmap.put(1, "aaa");
tmap.put(4, "qwerty");
tmap.put(3, "asdfg");
tmap.put(2, "zxcv");
// values() : value 들로 이루어진 Collection 리턴
System.out.println("values()");
for(String value : tmap.values()) {
System.out.println(value);
}
// 데이터 검색: get(key) 메소드를 사용
// 1. 키값들로만 이루어진 Set을 만듦
Set<Integer> kset = tmap.keySet();
// 2. keySet을 가지고 iterator를 만듬
Iterator<Integer> itr = kset.iterator();
while(itr.hasNext()) {
int key = itr.next();
System.out.println(key + " : " + tmap.get(key));
}
System.out.println();
// TreeMap에만 있는 KeySet을 만들어 내는 메소드
NavigableSet<Integer> navi = tmap.navigableKeySet();
Iterator<Integer> itr2 = navi.descendingIterator();
while(itr2.hasNext()) {
int key = itr2.next();
System.out.println(key + " : " + tmap.get(key));
}
// HashMap --> TreeMap 전환하기
System.out.println("HashMap() -> TreeMap() ");
HashMap<String, Integer> hmap = new HashMap<String, Integer>();
hmap.put("세종대왕", 10000);
hmap.put("신사임당", 50000);
hmap.put("퇴계이황", 5000);
hmap.put("이순신", 100);
System.out.println(hmap);
TreeMap<String, Integer> tmap2 = new TreeMap<String, Integer>(hmap);
// 키에 대한 오름차순으로 정렬되어 출력
System.out.println(tmap2);
System.out.println("\n프로그램 종료");
} // end main()
} // end class
'웹_프론트_백엔드 > JAVA프레임윅기반_풀스택' 카테고리의 다른 글
2020.03.30 (0) | 2020.03.30 |
---|---|
2020.03.27 (0) | 2020.03.27 |
2020.03.25 (0) | 2020.03.25 |
2020.03.24 (0) | 2020.03.24 |
2020.03.23 (0) | 2020.03.23 |