자바의정석
- CHAPTER 11 2019.01.31
- CHAPTER 9 2019.01.29
- CHAPTER5~CHAPTER7 2019.01.21
CHAPTER 11
1. List 인터페이스
List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현
1-1. ArrayList
- 연속적
- remove메서드는 끝에서부터 하는게 효율적 -> 처음이나 중간 값을 remove하면 해당 Index를 채워넣기 위해 System.arrayCopy가 호출되어야 하므로 비효율적이다.
1-2 LinkedList
- 불연속적
- 배열의 중간에 추가 혹은 삭제할 경우의 비효율성을 보완하기 위해 만들어짐
- 배열의 중간에 추가 혹은 삭제할 경우에 다음 노드의 주소값을 변경하기만 하면 돼서 효율적이다.
- 더블 링크드 리스트 : 단방향리스트는 이전요소에 대한 접근이 힘들기 때문에 이전/다음의 노드 주소값을 갖고 있다.
- 더블 써큘러 링크드 리스트 : 더블 링크드 리스트에서 처음과 끝을 이어준다.
- LinkedList클래스는 '더블 링크드 리스트'로 구현되어 있음!
컬렉션 | 읽기(접근시간) | 추가 / 삭제 | 비고 |
ArrayList | 빠르다 | 느리다 | 순차적인 추가삭제는 더 빠름 비효율적인 메모리 사용 |
LinkedList | 느리다 | 빠르다 | 데이터가 많을수록 접근성이 떨어진다. |
- 데이터의 개수가 변하지 않는 경우 : ArrayList
- 데이터 개수의 변경이 잦다면 : LinkedList
- 두 클래스의 장점을 이용해서 두 클래스를 조합해서 사용하는 방법도 있음.
1 2 3 4 5 | ArrayList al = new ArrayList( 100000 ); for ( int i= 0 ;i< 100000 ;i++) al.add(i); LinkedList ll = new LinkedList(al); for ( int i= 0 ;i< 100000 ;i++) ll.add( 500 , "X" ); |
2. Set 인터페이스
Set인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 클래스를 구현
3. Map 인터페이스
Map인터페이스는 Key와 Value를 하나의 쌍으로 묶어서 저장하는 컬렉션
Key는 중복이 허용되지 않고 Value는 중복이 허용된다.
메서드 |
설 명 |
boolean containsKey(Object key) |
지정된 key객체와 일치하는 Map의 key 객체가 있는지 확인 |
boolean containsValue(Object value) |
지정된 value객체와 일치하는 Map의 value 객체가 있는지 확인 |
Set entrySet() |
Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환 |
Set keySet() |
Map에 저장된 모든 key객체를 반환한다. |
Collection values() |
Map에 저장된 모든 value객체를 반환한다. |
values()에서는 반환타입이 Collection이고, keySet의 반환타입이 Set인거에 주목하자.
key는 중복을 허용하지 않기 때문에 Set / value는 중복을 허용하기 때문에 Collection 반환
3-1. Map.Entry 인터페이스
Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스 이다.
Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 정의해놓았다.
메서드 |
설 명 |
boolean equals(Object o) |
동일한 Entry인지 비교한다. |
Object getKey() |
Entry의 key객체를 반환한다. |
Object getValue() |
Entry의 value객체를 반환한다. |
int hashCode() |
Entry의 해시코드를 반환한다. |
Object setValue(Object value) |
Entry의 value객체를 지정된 객체로 바꾼다. |
'자바의정석' 카테고리의 다른 글
CHAPTER 9 (0) | 2019.01.29 |
---|---|
CHAPTER5~CHAPTER7 (0) | 2019.01.21 |
CHAPTER 9
1.1 Object 클래스
1.2 String 클래스
1.2.1 변경 불가능한 클래스
String a = "a"; (주소값 : 0x100)
String b = "b"; (주소값 : 0x200)
a = a+b; (주소값 : 0x300) -> 새로운 주소값으로 변경 -> 메모리공간차지하므로 비효율적
위와 같은 케이스의 경우 StringBuffer클래스의 append 메서드를 이용하는게 효율적!
1.2.2 문자열 비교
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | public class StringEx1 { public static void main(String[] args) { String str1 = "abc" ; // 문자열 리터럴 String str2 = "abc" ; // 문자열 리터럴 String str3 = new String( "abc" ); String str4 = new String( "abc" ); if (str1==str2) System.out.println( "1" ); if (str1.equals(str2)) System.out.println( "2" ); if (str3==str4) System.out.println( "3" ); if (str3.equals(str4)) System.out.println( "4" ); if (str1==str3) System.out.println( "5" ); if (str1.equals(str3)) System.out.println( "6" ); } } |
- 결과 값 : 1 2 4 6
1 : 주소값 같음
2 : 문자열 같음
3 : 주소값 다름
4 : 문자열 같음
5 : 주소값 다름
6 : 문자열 같음
- String 클래스에서
equals는 주소값 비교가 아닌 문자열 리터럴 비교
등가 연산자('==')는 주소값 비교
※ 참고사항 : 문자열리터럴은 동일한 주소를 가지며, 클래스가 로드될 때 JVM의 상수 풀(constant pool) 메모리 영역에 올라간다.
'자바의정석' 카테고리의 다른 글
CHAPTER 11 (0) | 2019.01.31 |
---|---|
CHAPTER5~CHAPTER7 (0) | 2019.01.21 |
CHAPTER5~CHAPTER7
5장 배열
1.5 배열의 복사
- 배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.
6장 객체지향프로그래밍
1.2 객체지향언어
1.2.1 객체지향언어의 주요 특징
1) 코드의 재사용성이 높다.
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2) 코드의 관리가 용이하다.
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3) 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며,
코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.
3. 변수와 메서드
3.1 선언위치에 따른 변수의 종류
1 2 3 4 5 6 7 8 | class Variables { int iv; // 인스턴스 변수 static int cv; // 클래스변수(static 변수, 공유변수) void method() { int lv = 0 ; // 지역변수 } } |
변수의 종류 |
선언위치 |
생성시기 |
클래스 변수 (class variable) |
클래스 영역 |
클래스가 메모리에 올라갈 때 |
인스턴스변수 (instance variable) |
인스턴스가 생성되었을 때 |
|
지역변수 (local variable) |
클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부) |
변수 선언문이 수행되었을 때 |
3.2 클래스변수와 인스턴스 변수
- 인스턴스 변수는 인스턴스가 생성될 때마다 생성되므로 인스턴스는 각기 다른 값을 갖지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다.
3.7 JVM의 메모리 구조
3.7.1 메서드영역(method area)
- 프로그램 실행 중 사용되는 클래스에 대한 정보를 저장.
이 때 클래스의 클래스 변수도 이 영역에 함께 저장됨.
3.7.2 힙
- 프로그램 실행 중 생성되는 인스턴스에 대한 정보를 저장
3.7.3 호출스택
- 메서드의 작업에 필요한 메모리 공간을 제공.
메서드 안에 메서드를 호출할 경우 스택형식으로 쌓이며, 가장 마지막 호출 메서드부터 종료된다.
3.10 재귀호출
- 반복문에 비해 성능이 좋지 않다.
- 대신, 복잡한 로직 처리 요건을 하고자 할 때 반복문에 비해 간결하고 직관적이다.
- 따라서, 상황에 맞게 알아서 잘 사용해야 한다.
3.11 클래스 메서드와 인스턴스 메서드
- 인스턴스 메서드는 인스턴스 변수/메서드와 관련된 작업을 하는 메서드로 개발하여야 한다.
- 클래스 메서드는 인스턴스 변수/메서드와 관련이 없는 작업을 하는 메서드로 개발하여야 한다.
-> 클래스 메서드 내부에서 인스턴스 변수 조작 불가 && 인스턴스 메서드보다 성능이 더 빠르다.
-> 이미 메모리(Method Area)에 올라가 있기 때문
'자바의정석' 카테고리의 다른 글
CHAPTER 11 (0) | 2019.01.31 |
---|---|
CHAPTER 9 (0) | 2019.01.29 |