자바의정석

CHAPTER 11

2019. 1. 31. 20:10

1. List 인터페이스

List인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현


1-1. ArrayList

- 연속적

- remove메서드는 끝에서부터 하는게 효율적 -> 처음이나 중간 값을 remove하면 해당 Index를 채워넣기 위해 System.arrayCopy가 호출되어야 하므로 비효율적이다.

1-2 LinkedList

- 불연속적

- 배열의 중간에 추가 혹은 삭제할 경우의 비효율성을 보완하기 위해 만들어짐

- 배열의 중간에 추가 혹은 삭제할 경우에 다음 노드의 주소값을 변경하기만 하면 돼서 효율적이다.

- 더블 링크드 리스트 : 단방향리스트는 이전요소에 대한 접근이 힘들기 때문에 이전/다음의 노드 주소값을 갖고 있다.

- 더블 써큘러 링크드 리스트 : 더블 링크드 리스트에서 처음과 끝을 이어준다.

- LinkedList클래스는 '더블 링크드 리스트'로 구현되어 있음!


 컬렉션 

 읽기(접근시간) 

 추가 / 삭제 

 비고 

 ArrayList

 빠르다

 느리다 

 순차적인 추가삭제는 더 빠름

 비효율적인 메모리 사용 

 LinkedList

 느리다 

 빠르다 

 데이터가 많을수록 접근성이 떨어진다. 


- 데이터의 개수가 변하지 않는 경우 : ArrayList

- 데이터 개수의 변경이 잦다면 : LinkedList

- 두 클래스의 장점을 이용해서 두 클래스를 조합해서 사용하는 방법도 있음.


		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

2019. 1. 29. 19:54

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 문자열 비교


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

2019. 1. 21. 21:30

5장 배열

1.5 배열의 복사

- 배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.


6장 객체지향프로그래밍


1.2 객체지향언어

1.2.1 객체지향언어의 주요 특징

1) 코드의 재사용성이 높다.

- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.

2) 코드의 관리가 용이하다.

- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.

3) 신뢰성이 높은 프로그래밍을 가능하게 한다.

- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 

  코드의 중복을 제거하여 코드의 불일치로 인한 오작동을 방지할 수 있다.


3. 변수와 메서드

3.1 선언위치에 따른 변수의 종류

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

+ Recent posts