반응형

■ 기준 클래스 준비

public class Person {
	String name;
	int weight;

	public Person(String name, int weight) {
		this.name = name;
		this.weight = weight;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", weight=" + weight + "]";
	}
}

Comparator 인터페이스를 이용한 ArrayList 정렬

1) Comparator 인터페이스를 구현한 클래스 준비

Person 객체의 weight 인스턴스 변수를 이용한 정렬

  • 내림차순 정렬
  • 오름차순 정렬
class ComparatorPerson implements Comparator<Person> {

	@Override
	public int compare(Person o1, Person o2) {

		// ※ weight 변수를 이용한 정렬

// 1 -- 내림 차순 정렬
		int result = 1;
		if (o1.weight >= o2.weight)
			result = -1;
		return result;

// 2-- 오름 차순 정렬
//		int result = -1;
//		if (o1.weight >= o2.weight)
//			result = 1;
//		return result;

	}
}

2) Comparator 인터페이스를 이용한 ArrayList 정렬

  • List의 sort 메서드를 이용한 정렬
  • Collections의 sort 메서드를 이용한 정렬
public class ComparatorTest {
	public static void main(String[] args) {

		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("HAN", 160));
		personList.add(new Person("HONG", 170));
		personList.add(new Person("KIM", 180));
		
		// 정렬 전 데이터 확인
		for(Person person : personList) {
			System.out.println("정렬 전 : " + person);
		}
		
// 1 -- List의 sort 메서드를 이용한 정렬
		// personList.sort(new comparatorPerson());

// 2 -- Collections의 sort 메서드를 이용한 정렬
		Collections.sort(personList, new ComparatorPerson());
		
		// 정렬 후 데이터 확인
		Iterator<Person> itp = personList.iterator();
		while (itp.hasNext()) {
			System.out.println("정렬 후 : " + itp.next());
		}
	}
}

3) 출력 결과

weight 변수를 기준으로 내림차순 정렬

  • 빨간색 체크 : 정렬 전 데이터 확인
  • 파란색 체크 : 정렬 후 데이터 확인

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com


interface의 익명클래스 처리방법을 활용한 정렬

1) interface의 익명클래스 처리방법을 활용한 정렬

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class AnonymousClassSort {

	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("HAN", 160));
		personList.add(new Person("HONG", 170));
		personList.add(new Person("KIM", 180));

		// 정렬 전 데이터 확인
		for (Person person : personList) {
			System.out.println("정렬 전 : " + person);
		}

		// 익명클래스를 활용한 내림차순 정렬
		Collections.sort(personList, new Comparator<Person>() {

			@Override
			public int compare(Person o1, Person o2) {
				// 1 -- 내림 차순 정렬
				int result = 1;
				if (o1.weight >= o2.weight)
					result = -1;
				return result;

				// 2-- 오름 차순 정렬
//				int result = -1;
//				if (o1.weight >= o2.weight)
//					result = 1;
//				return result;
			}
		});

		// 정렬 후 데이터 확인
		Iterator<Person> itp = personList.iterator();
		while (itp.hasNext()) {
			System.out.println("정렬 후 : " + itp.next());
		}
	}
}

2) 출력 결과

weight 변수를 기준으로 내림차순 정렬

  • 빨간색 체크 : 정렬 전 데이터 확인
  • 파란색 체크 : 정렬 후 데이터 확인

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com


람다 표현식을 활용한 정렬

1) 람다 표현식을 활용한 정렬

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class LambdaSort {
	public static void main(String[] args) {
		List<Person> personList = new ArrayList<Person>();
		personList.add(new Person("HAN", 160));
		personList.add(new Person("HONG", 170));
		personList.add(new Person("KIM", 180));

		// 정렬 전 데이터 확인
		for (Person person : personList) {
			System.out.println("정렬 전 : " + person);
		}

		// 람다표현식을 활용한 내림차순 정렬
		Collections.sort(personList, (Person o1, Person o2) -> {
			// 1 -- 내림 차순 정렬
			int result = 1;
			if (o1.weight >= o2.weight)
				result = -1;
			return result;

			// 2-- 오름 차순 정렬
//				int result = -1;
//				if (o1.weight >= o2.weight)
//					result = 1;
//				return result;
		});

		// 정렬 후 데이터 확인
		Iterator<Person> itp = personList.iterator();
		while (itp.hasNext()) {
			System.out.println("정렬 후 : " + itp.next());
		}
	}
}

2) 출력 결과

weight 변수를 기준으로 내림차순 정렬

  • 빨간색 체크 : 정렬 전 데이터 확인
  • 파란색 체크 : 정렬 후 데이터 확인

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com

반응형
반응형

이클립스(Eclipse) 한글 깨짐 현상 해결

1. Encoding 변경

1) Window

2) Preferences 이동

1) 검색창 encoding 입력 

2) Content Types, Workspace, CSS Files, HTML Files, JSP Files, XML Files encoding 방식 'UTF-8' 로 변경

1. Content Types 설정

1) Java Class File 선택

2) UTF-8 입력

3) Update 버튼 클릭

2. Workspace 설정

1) Other : UTF-8 로 변경

2) Apply 버튼 클릭

3. CSS Files, HTML Files, JSP Files, XML Files

1) Encoding : ISO 10646/Unicode(UTF-8) 로 변경

2) Apply 버튼 클릭


2. Spelling Encoding 'UTF-8'로 변경

1) General

2) Editors

3) Text Editors

4) Spelling

5) Other : UTF-8로 변경

6) Apply 버튼 클릭


3. Project Resource encoding 'UTF-8'로 변경

1) Project 탭 클릭

2) Properties 클릭

1) Resource 클릭

2) Other : UTF-8 로 변경

3) Apply 버튼 클릭

반응형
반응형

컬렉션(Collection API) 

  • 배열과 다르게 하나의 컬렉션에 서로 다른 데이터형이 저장 가능하다.
  • 참조 데이터 형만 저장가능하다. 기본 데이터형은 Wrapper 클래스를 이용하거나, 오토박싱으로 저장 가능하다.
  • 객체인 데이터를 저장할 때마다 크기가 자동으로 늘어난다.
  • 제네릭(Generic) 타입을 지원한다.

※ 대표적인 메서드

메서드 설명
boolean add(Object o)
boolean addAll(Collection c)
지정된 객체 또는 Collection의 객체들을 Collection 에 추가
void clear() Collection의 모든 객체를 삭제
boolean isEmpty() Collection이 비어있는지 확인
int size() Collection에 저장된 객체의 갯수
Object[] toArray() Collection에 저장된 객체를 배열로 변환
boolean contains(Object o) Collection o 요소를 포함하고 있는지 반환
Iterator<E> iterator() Collection에 저장된 데이터를 반복출력하기 위한 Iterator 인터페이스 반환.

■ Set 계열

  • 데이터의 저장 순서가 없기 때문에 중복 저장이 불가능하다.
  • 저장된 위치를 알 수 없기 떄문에 위치값으로 데이터를 얻을 수 없다.
  • 실제 구현된 HashSet 과 SortedSet 같은 클래스들을 이용하여 Set 계열을 사용할 수 있다.

1) add 메서드 - Set 요소 추가 

// Set 객체 생성
Set<String> s = new HashSet<String>();

// Set에 요소 추가 
s.add("HAN");
s.add("PARK");
s.add("KIM");
s.add("LEE");
s.add("HAN");
s.add("HAN");

// 중복된 요소는 제거된걸 알 수 있다.
System.out.println("toString 메서드 전체 출력 : " + s);

// ※ 출력 결과
// toString 메서드 전체 출력 : [HAN, LEE, KIM, PARK]

2) for-each 문 - Set 요소 확인

// for-each 문을 활용한 요소 출력
for(String name : s) {
	System.out.println("foreach : " + name);
}

// ※ 출력 결과
/*
foreach : HAN
foreach : LEE
foreach : KIM
foreach : PARK
*/

3) Iterator 인터페이스 활용 - Set 요소 확인

// Iterator 를 활용한 요소 출력
Iterator<String> its = s.iterator();
while(its.hasNext()){
	String name = its.next();
	System.out.println("iterator : " + name);
}

// ※ 출력 결과
/*
iterator : HAN
iterator : LEE
iterator : KIM
iterator : PARK
*/

4) isEmpty 메서드, contains 메서드, size 메서드 

  • isEmpty :  Set 요소가 비어있는지 확인 후 boolean 형으로 결과 반환
  • contains : Set 요소에 포함되어 있는지 확인 후 boolean 형으로 결과 반환
  • size : Set 요소의 갯수 확인 후 int 형으로 결과 반환
// Set의 요소가 비었는지 확인
System.out.println("Set가 비어있는가 ? " + s.isEmpty()); 

// Set의 확인하고자 하는 요소가 존재하는지 확인
System.out.println("Set에 HAN 요소가 존재하는가? " + s.contains("HAN"));

// Set의 요소의 갯수 확인
System.out.println("Set의 요소 갯수는 ? " + s.size());

// ※ 출력 결과
/*
Set가 비어있는가 ? false
Set에 HAN 요소가 존재하는가 ? true
Set의 요소 갯수는 ? 4
*/

5) remove 메서드, clear 메서드

  • remove : Set에 요소명으로 삭제
  • clear : Set에 전체 요소 삭제
// Set의 원하는 요소 삭제(순서가 없기 때문에 요소명으로 삭제한다)
s.remove("HAN");
System.out.println("HAN 요소를 삭제 후 데이터 확인  : " + s);	

// Set의 전체요소 삭제
s.clear();
System.out.println("전체 요소를 삭제 후 데이터 확인: " + s);

// ※ 출력 결과
/*
HAN 요소를 삭제 후 데이터 확인 : [LEE, KIM, PARK]
전체 요소를 삭제 후 데이터 확인 : []
*/

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com


■ List 계열

  • 데이터의 저장되는 순서가 있기 때문에 데이터가 중복 저장이 가능하다.
  • 기본적으로 저장된 위치값을 사용할 수 있기 때문에 Set 계열 보다 다양한 기능을 처리할 수 있다.

※ 컬렉션 대표적인 메서드를 제외한 List 메서드

메서드 설명
Object get(int index) List의 index위치에 있는 요소를 반환
void add(Object o)
void add(int index, Object o)
List에 순차적으로 추가 
List의 index위치에 요소 o를 추가 
void set(int index, Object o) List의 index위치에 요소를 o로 수정
void remove(Object o)
void remove(int index)
List의 첫번째 위치부터 순서대로 확인하여, 요소 o 를 삭제 (한개)
List의 index위치에 요소를 삭제 

1) add 메서드 - List 요소 추가

// List 객체 생성
List<String> list = new ArrayList<String>();

// List에 요소 추가 (index를 지정하지 않으면 순차적으로 추가된다) 
list.add("HAN");
list.add("PARK");
list.add("KIM");
list.add("LEE");
list.add("HAN");
list.add("HAN");

// List에 원하는 위치에 데이터 삽입
System.out.println("데이터 삽입 전 데이터 확인 : " + list);
list.add(1,"CHOI");
System.out.println("데이터 삽입 후 데이터 확인 : " + list);

// ※ 출력 결과
/*
데이터 삽입 전 데이터 확인 : [HAN, PARK, KIM, LEE, HAN, HAN]
데이터 삽입 후 데이터 확인 : [HAN, CHOI, PARK, KIM, LEE, HAN, HAN]
*/

2) for-each문, Iterator 인터페이스 활용 - List 요소 확인

// for-each 문을 활용한 요소 출력
for(String name : list) {
	System.out.println("foreach : " + name);
}

// Iterator 를 활용한 요소 출력
Iterator<String> its = list.iterator();
while(its.hasNext()){
	String name = its.next();
	System.out.println("iterator : " + name);
}

// ※ 출력 결과
/*
foreach : HAN
foreach : CHOI
foreach : PARK
foreach : KIM
foreach : LEE
foreach : HAN
foreach : HAN

iterator : HAN
iterator : CHOI
iterator : PARK
iterator : KIM
iterator : LEE
iterator : HAN
iterator : HAN
*/

3) toArray 메서드 - List 객체를 배열로 변환

// List를 배열로 변환
Object[] arr = list.toArray();
System.out.println("List 객체를 배열로 변환 후 데이터 확인 : " + Arrays.toString(arr));

// ※ 출력 결과
// List 객체를 배열로 변환 후 데이터 확인 : [HAN, CHOI, PARK, KIM, LEE, HAN, HAN]

4) get 메서드, isEmpty 메서드, contains 메서드, size 메서드

  • get : List 요소 중 index에 해당하는 요소 반환
  • isEmpty :  List 요소가 비어있는지 확인 후 boolean 형으로 결과 반환
  • contains : List 요소에 포함되어 있는지 확인 후 boolean 형으로 결과 반환
  • size : List 요소의 갯수 확인 후 int 형으로 결과 반환
// List의 첫번째 인덱스(0)의 요소 반환
System.out.println("List의 첫번째 인덱스 위치에 있는 요소는? " + list.get(0));

// List의 요소가 비었는지 확인
System.out.println("List가 비어있는가 ?" + list.isEmpty()); 

// List의 확인하고자 하는 요소가 존재하는지 확인
System.out.println("List에 HAN 요소가 존재하는가?" + list.contains("HAN"));

// List의 요소의 갯수 확인
System.out.println("List의 요소 갯수는 ?" + list.size());

// ※ 출력 결과
/*
List의 첫번째 인덱스 위치에 있는 요소는 ? HAN
List가 비어있는가 ? false
List에 HAN 요소가 존재하는가 ? true
List의 요소 갯수는 ? 7
*/

5) set 메서드 - List의 원하는 index의 요소값을 수정

// List에 원하는 위치에 데이터 삽입
System.out.println("데이터 수정 전 데이터 확인 : " + list);
list.set(1,"KANG");
System.out.println("데이터 수정 후 데이터 확인 : " + list);

// ※ 출력 결과
/*
데이터 수정 전 데이터 확인 : [HAN, CHOI, PARK, KIM, LEE, HAN, HAN]
데이터 수정 후 데이터 확인 : [HAN, KANG, PARK, KIM, LEE, HAN, HAN]
*/

6) remove 메서드, clear 메서드

  • remove : List의 요소값 혹은 위치에 해당하는 요소를 삭제
  • clear : List의 전체 요소 삭제
// List의 요소명으로 원하는 요소 삭제
list.remove("HAN");
System.out.println("HAN 요소 삭제 후 데이터 확인 : " + list);	

// List의 요소의 인덱스로 원하는 요소 삭제
list.remove(0);
System.out.println("첫번째 인덱스의 요소 삭제 후 데이터 확인 : " + list);	

// List의 전체요소 삭제
list.clear();
System.out.println("전체 요소 삭제 후 데이터 확인 : " + list);

// ※ 출력 결과
/*
HAN 요소를 삭제 후 데이터 확인 : [KANG, PARK, KIM, LEE, HAN, HAN]
첫번째 인덱스의 요소 삭제 후 데이터 확인 : [PARK, KIM, LEE, HAN, HAN] 
전체 요소를 삭제 후 데이터 확인 : []
*/

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com

반응형
반응형

제네릭(Generic)

다양한 타입의 객체에 재사용을 높일 수 있는 기법으로 클래스에서 사용할 타입을 외부에서 설정하는 것


제네릭 타입

제네릭 타입은 원하는 데로 지정해도 되지만, 암묵적인 약속처럼 공통적으로 자주 사용하는 타입인자

타입 인자 의미
E Element
K Key
N Number
T Type
V Value
R Result

※ 특징 3가지

1. 객체 생성이 가능한 타입에 대해서만 제네릭 사용이 가능하다.

18행 : Wrapper 클래스인 Interger 클래스를 제네릭 타입으로 지정하면 에러가 발생하지 않는다.

21행 : 기본 자료형인 int형으로 제네릭 타입으로 지정하면 에러가 발생한다. 

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com


2. 객체의 타입을 컴파일 시점에서 체크하기 때문에 타입 안정성을 높이고, 형변환의 번거러움을 줄인다.

1) 비교를 위해 두 클래스 준비

  • 제네릭 클래스
  • Object 클래스형 인스턴스 변수를 갖는 클래스

2) 비교 작업

35행 : 제네릭 타입이 String 형이기 때문에 Integer형 데이터를 입력하면 에러가 발생한다.

38행 : 제네릭의 경우 강제 형변환을 하지 않아도 된다.

43행 : set 메서드를 통해 obj는 String 형으로 형태가 정해진다.

45행 : get 메서드를 통해 obj를 반환하여 String 형태로 변환할 경우 강제 형변환(다운캐스팅)이 필요하다. 

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com


3. 와일드 카드<?> 제한 

표현 설명
<?> 타입 제한이 없다. <? extends Object>와 동일 기능
<? extends T> T 와 T를 상속받는 하위 클래스만 사용 가능
<? super T> T 와 T의 부모 클래스만 사용 가능

21행 : 파라미터로 제네릭 타입이 Object 이거나 Object의 자식 클래스는 모두 지정 가능

22행 : 파라미터로 제네릭 타입이 Pet 형 이거나 Pet의 자식 클래스는 모두 지정 가능

23행 : 파라미터로 제네릭 타입이 Dog 형 이거나 Dog의 부모 클래스는 지정 가능

 

※ 상세설명은 main 메서드의 내용 참고

 

SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com

반응형
반응형

오버로딩(Overloading)

한 클래스내에 같은 이름의 메서드를 여러개 정의하는 것을 의미한다.


■ 생성자 오버로딩

생성자는 클래스의 객체를 생성(인스턴스화)할때 호출되는 메서드로써,
인스턴스변수의 초기화 작업이나 객체를 생성할때 초기 작업을 수행할때 사용한다.
인스턴스변수를 부분적으로 나눠서 초기화 작업을 수행할때 생성자 오버로딩이 사용되기도 한다. 


※ 조건

  • 이름이 같아야한다.
  • 매게변수가 달라야 한다.

1) 오버로딩된 생성자

2) main() 메서드

3) 출력 결과


 메서드 오버로딩

매게변수를 다양하게 받아 다양한 처리를 하나의 메서드명을 중복으로 사용함으로써
다양한 메서드명으로 나눠서 기억해서 작업하지 않아도 되는 장점이 있다. 


※ 조건

  • 이름이 같아야한다.
  • 매게변수가 달라야 한다.
  • 리턴타입은 무관하다.

1) 오버로딩된 메서드

2) main() 메서드

3) 출력 결과


SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com

반응형
반응형

오버라이딩(Overriding)

상속관계에 있는 부모 클래스의 메서드를 자식클래스에서 재정의 하는것을 의미한다.


※ 특징

1) 메서드명이 동일 해야한다.

- 부모클래스에서 정의한 메서드와 자식클래스에서 재정의한 메서드의 메서드명이 같아야 한다.

2) 매게변수가 동일 해야한다.

3) 리턴 타입이 동일 해야한다.

4) 접근 범위가 같거나 넓은 접근 제어자를 사용해야한다.

- 부모클래스에서 정의한 메서드의 접근 제어자와 같거나 보다 접근범위가 넓은 접근 제어자로 자식클래스의 메서드를 재정의 해야한다.

 

  * 접근제어자 접근범위가 넓은 순서 : public > protected > default > private(오버라이딩 불가)

5) 부모클래스에서 정의한 메서드의 예외(Exception) throws 보다 좁은 예외를 throws 해야한다.

- 이해를 돋기위해 Exception 의 자식클래스에 존재하는 NullPointerException으로 재정의 했다.


1. main() 메서드 

  • 자식클래스 객체 생성
  • 오버라이딩된 메서드 호출

2. 출력 결과

- 출력결과를 통해 오버라이딩된 자식클래스의 메서드가 호출된걸 알 수 있다. 


SOURCE CODE

 

hyunmin94/JavaExam

Contribute to hyunmin94/JavaExam development by creating an account on GitHub.

github.com

 

반응형

+ Recent posts