본문 바로가기

Java

(17)
Java의 접근제어자(Access Modifier) [접근제어자(Access Modifier)] 변수나 메소드의 사용 권한은 다음과 같은 접근 제어자를 사용하여 설정할수 있다. private private 이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능하다. default 접근 제어자가 없는 변수, 메소드는 default 접근 제어자가 되어 default로 지정된 변수나 메서드가 있는 클래스와 같은 패키지 내에서만 접근이 가능하다. 접근 제어자를 별도로 설정하지 않는다면 default 접근 제어자가 된다. package house; public class HouseKim { String lastname = "kim"; // lastname은 default 접근제어자로 설정된다. } package house; public class HousePark..
Iterable와 Iterator에 대해 Iterable Iterable 인터페이스는 java.lang 패키지에 속하며 반복할 수 있는 데이터 구조를 나타낸다. Iterable 인터페이스는 Iterator를 생성하는 메서드를 제공한다. Iterable을 사용할 때 인덱스로 요소를 가져올 수 없으며 데이터 구조에서 첫 번째 또는 마지막 요소도 가져올 수 없다. Java의 모든 Collection은 Iterable 인터페이스를 구현한다. 향상된 for문을 사용하여 Collection 내부의 element들을 반복할 수 있다. 그러나 Iterable 인터페이스를 구현하는 객체만 이러한 명령문 내에서 사용할 수 있다. List list = getStrings(); list.forEach(System.out::println); Iterator Itera..
자바에서의 제네릭과 와일드카드 [자바에서 제네릭이란] 제네릭은 매개변수화된 유형을 의미한다. 이것은 Integer, String, ...등 및 사용자 정의 유형의 메서드, 클래스 및 인터페이스에 대한 매개변수가 될 수 있도록 하는 것이다. 제네릭을 이용하면 다양한 데이터 유형을 작동하는 클래스를 생성할 수 있다. [왜 제네릭을 사용하는가] 제네릭은 Java 5부터 새로 추가되어 등장했는데, 제네릭 타입을 이용함으로써 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다. List list = new LinkedList(); list.add(new Integer(1)); Integer i = list.iterator().next(); 위와 같이 코드를 구현하게 되면 컴파일러는 어떤 데이터 유형이 반환되었는지 모르..
Java Garbage Collection(GC)란 무엇이고 동작방식과 G1GC에 대해 C와 같은 프로그래밍 언어에서 메모리 할당 및 할당 해제는 수동 프로세스입니다. 반면에, Java에서 메모리 할당 해제 프로세스는 Garbage Collection에 의해 자동으로 처리가 됩니다. [기본 프로세스] Step1 : Marking Garbage Collector가 사용중인 메모리 조각과 사용하지 않는 메모리 조각을 식별합니다. 마킹 단계에서 모든 개체들을 스캔하다보니 많은 시간이 소요될 수 있습니다. Step2 : Normal Deletion 참조되지 않은 개체를 제거하여 참조된 개체와 포인터를 여유 공간으로 남깁니다. 메모리 할당자는 새 개체를 할당할 수 있는 여유 공간 블록에 대한 참조를 보유합니다. Step2a : Deletion with Compacting 성능 향상을 위해 참조된 나..
JVM 구조와 Java의 실행방식 JVM(Java Virtual Machine) : 자바 바이트 코드를 해석하고 실행하는 것을 말한다. JVM 특징 스택 기반의 가상 머신 심볼릭 레퍼런스 기본 자료형(primitive data type)을 제외한 모든 타입(클래스와 인터페이스)을 명시적인 메모리 주소 기반의 레퍼런스가 아니라 심볼릭 레퍼런스를 통해 참조한다. 참고하는 클래스의 특정 메모리 주소를 참조 관계로 구성한 것이 아닌 참조하는 대상의 이름만을 지칭한 것이다. 가비지 컬렉션(garbage collection) 클래스 인스턴스는 사용자 코드에 의해 명시적으로 생성되고 가비지 컬렉션에 의해 자동으로 파괴된다. 기본 자료형을 명확하게 정의하여 플랫폼 독립성을 보장 C/C++ 등의 전통적인 언어는 플랫폼에 따라 int형의 크기가 변한다. ..
멀티 스레드의 스레드들이 객체를 공유하는데 임계영역의 문제를 해결하지 않은 경우 '이것이 자바다'의 12장의 예제를 참고하여 실습한 내용입니다 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class SynchronizedCalculator { private int memory; public int setMemory(int memory) { this.memory = memory; try { Thread.sleep(2000); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getName() + " = " + this.memory); return this.memory; } } Colored by Color Scripter cs 1 2 3 4 5 6 7 8 9..
Java char타입의 초기화를 할 때 '' 불가한 이유 char 타입은 원시적으로 값이 있어야만 한다 char 값은 항상 0 ~ 65535 범위에서 정확히 하나의 값을 나타낸다 리터럴 ‘’는 ‘문자가 없음’이며 이를 의미하는 char 타입에 할당 될 수 있는 값은 없다 String 문자열은 배열이므로 “”와 같이 아무것도 전달하지 않아도 기본적인 빈 배열이 만들어지므로 String str = “”;와 같은 초기화가 가능합니다 빈 값과 유사하게 '\0'으로 초기화를 통해 근접한 상황을 만들 수는 있다
Java GC 처리방법 GC랑 garbage collection으로 메모리 관리 기법 중 하나이다 프로그램이 동적으로 할당한 메모리 영역 중 필요없게 된 영역을 해제하는 기능이다 포인터 추적 방식은 한개 이상의 변수가 접근 가능한 메모리는 앞으로 사용할 수 있는 메모리로 간주하고 그 밖의 메모리를 해제하는 방식을 가리킨다 GC를 하는 방식으로는 포인터 추적 방식을 대부분 사용한다 접근 가능한 객체는 어떤 변수가 집접 가리키는 메모리 또는 간접적으로 가리키는 메모리를 의미 포인터 추적 방식 가장 단순한 기법 영역 표시를 위해 각 메모리 할당 시 1비트의 메모리를 남겨둔다 표시단계에서 모든 변수가 가리키는 영역을 사용 중으로 표시하고 그 영역에 서 가리키는 또다른 영역 또한 사용중으로 표시 접근이 불가능한 메모리 영역들은 쓸기 단..
Java 제네릭 제네릭 제네릭을 사용하는 이유 Java 5부터 제네릭이 지원이 되었으며 제네릭을 통해 잘못된 타입이 사용될 수 있는 문제를 컴파일 과정에서 제거할 수 있게 되었다 제네릭의 장점 컴파일 시 강한 타입 체크를 할 수 있다 타입 변환을 제거한다 // Case 비제네릭 List list = new ArrayList(); list.add("hello"); String str = (String)list.get(0); // 타입 변환을 반드시 해야한다 // Case 제네릭 List list = new ArrayList(); list.add("hello"); String str = list.get(0); 위에 예제처럼 제네릭으로 String을 지정하는 경우, List의 데이터 타입이 String으로 제한되기 때문에 별..
Java 상속 상속(Inheritance) 상속 상속은 부모 클래스의 기능을 자식 클래스에게 물려주는 것 같은 패키지 내에서 부모 클래스의 private 접근 제한자를 갖는 필드와 메소드를 제외한 나머지를 상속한다 다른 패키지라면 부모 클래스의 private와 default 접근 제한자를 갖는 필드와 메소드를 제외한 나머지들이 상속된다 다중 상속을 허용하지 않는다 (extends 뒤에는 하나의 부모 클래스만 올 수 있다) 상속을 통해 heap영역에 부모 객체가 먼저 생성이 되고 자식객체가 생성이 된다 동일한 기능을 반복하지 않게하여 코드의 재사용을 증가시킨다 // 상속 방법 class ChildClassName extends ParentClassName { // field // constructor // method ..