JDK, JRE 차이
JDK는 JRE를 포함할 뿐만 아니라 컴파일러(javac), javadoc, jar 등 개발에 유용한 도구들을 포함하고 있다. 따라서 자바 프로그램을 개발하기 위해서는 JDK를 다운로드하여야 한다. 결론은 JRE는 자바 실행 환경이고, JDK는 자바 개발 도구라는 것이다
Main method
- 참고
- Java에서는 application이 실행된다면 제일 먼저 main method 실행
- public
- 접근 제어자, private → protected → public 순
- 어느 곳이던 해당 객체를 참조할 수 있음
- overriding 불가
- static
- 함수를 정의하는 경우, 함수 또는 클래스를 호출 했을 때, 해당 객체 는 Java가 Compile 되는 순간부터 정의
(이후에 static이 아닌 객체가 정의 된다.) - 고로 static인 객체에서 static이 아닌 객체를 호출 할 수 없음.
- 함수를 정의하는 경우, 함수 또는 클래스를 호출 했을 때, 해당 객체 는 Java가 Compile 되는 순간부터 정의
- void
- 실행만 할 뿐, 돌려주지 않는다.
- Return 값이 없고, 호출한 부분으로 이동할 뿐임.
(함수가 호출된 부분으로) - void 자리에 int를 넣을 경우 : int형 데이터 return
- void 자리에 String을 넣을 경우 : 문자열 데이터를 return
- main method는 java application 실행 시, 가장 먼저 동작하며, 어느 객체도 접근할 수 있으며, java가 compile 되는 순간 정의가 되는 return 없는 함수
- String[] args
- 매개변수, String은 문자열을 []은 배열을 args는 단순히 변수 명을 명명해 놓은 것
- ⇒ 연속적인 문자열이 들어가는 저장 공간(매개 변수 인자)
- java command-line에서 Class 명 뒤에 문자열로 된 인자를 넣으면 내부적으로 해당 인자를 사용할 수 있음.
- public
메모리 사용 영역
- 참고
- java를 실행하면 jvm이 실행되는데 jvm은 운영체제에서 할당 받은 메모리 영역을 구분함
- Method area
- 코드에서 사용되는 클래스를 읽어 별도의 런타임 상수 풀, 필드/메소드 데이터, 메소드 코드, 생성자 코드 등을 분류해서 저장함.
- 메서드 영역은 jvm이 시작할 때 생성되고, 모든 스레드가 공유하는 영역
- Stack area
- java program에서 추가적으로 thread를 생성하지 않는다면, main 스레드만 존재하므로 jvm stack도 하나
- method를 호출할 때마다 프레임을 추가하고 method가 종료되면 해당 프레임을 제거하는 동작을 수행
- 프레임 내부에는 로컬 변수 Stack이 있는데, 기본/참조 타입 변수가 추가 혹은 제거됨
- method, if문, for문 등에서 내부에서 생성된 변수는 해당 로컬 변수 stack에만 존재하므로 해당 구문을 빠져 나오게 되면 제거가 됨 → 외부에서 사용이 불가능
- 배열 같은 경우, 배열의 변수는 Stack area에 생성 되지만, 배열의 데이터 자체는 Heap 영역에 생성 되어 제거 되지 않습니다.
⇒ Java에서 배열은 객체로 취급
- Heap area
- 객체와 배열이 생성되는 영역. Heap 영역에 생성된 객체와 배열은 jvm 스택 영역의 변수나 다른 객체의 필드에서 참조
- 참조하는 변수나 필드가 없다면 의미 없는 객체가 되기 때문에 이것을 쓰레기로 취급
→ JVM은 Garbage Collector를 실행시켜 쓰레기 객체를 Heap area에서 자동으로 제거- 고로 개발자는 객체를 제거하기 위한 코드를 작성할 필요가 없음
- Method area
Data type of Java
- 참고
- 본인은 변수 = 로 명시하는 Java 문법이 이해가 가지 않아, 찾아보게 되었음.
- 비슷한 문제로 자료를 찾아보는 사람들에게 도움이 되었으면 하는 마음에서 정리해두기로 함.
원시 타입
- 기본 데이터 타입
- 정수형 : bytes, short, int, long
- 실수형 : float, double
- 문자형 : char
- 논리형 : boolean
- 비객체 타입이므로 null 값을 가질 수 없음(기본 값이 정해져 있음)
- 변수 선언과 동시에 메모리 생성
- 실제 데이터 값을 저장하는 타입으로, 기본 타입으로 지정된 변수의 값은 Stack 공간에 저장된다.
참조 타입
- 참조 데이터 타입
- 문자열, 배열, 열거, 클래스, 인터페이스
- 기본 타입을 제외한 타입들로, 객체의 주소를 저장하는 타입
- 즉, 메모리 주소 값을 저장하고 메모리 주소를 통해 객체를 참조하는 타입으로, 해당 값은 Heap 영역에 저장된다.
- 참조형 변수는 null로 초기화 시킬 수 있음.
차이(성능, 저장 등)
- null 값 가능 여부
- 기본 타입 : 불가능
- 참조 타입 : 가능
- 제네릭 타입 사용 가능 여부
- 기본 타입 : 불가능
- 참조 타입 : 가능
- 접근 속도
- 기본 타입 : stack 메모리에 값이 존재 하기 때문에 접근 속도가 빠름
- 참조 타입 : stack 메모리엔 주소만, 실제 값은 heap 메모리에 있기 때문에 접근 속도가 느림
- 메모리 양
- 기본 타입에 비해 참조 타입이 사용하는 메모리 양이 압도적으로 높음
- 메모리 사용 시 기본 타입이 참조 타입보다 훨씬 효율적으로 사용 가능함.
타입 기본 타입의 사용 메모리 참조 타입의 사용 메모리 boolean / Boolean 1bit 128 bits byte / Byte byte - 8bits 128bits short, char / Short, Character 16bits 128bits int, float / Integer, Float 32bits 128bits long, double / Long, Double 64bits 196bits
예외 구문 - throws ,throw
- 참고
throws는 자신을 호출하는 method에 예외 처리의 책임을 떠넘기는 것이다.
- 기본적으로 체크 예외 전략이다.
- 언 체크(런타임)예외는 체크 예외와 다르게 throws 예외 선언을 하지 않아도 된다.예외를 잡지 않아도 자연스럽게 상위로 넘어가기 때문이다.
throw는 throws랑 확연히 다르다. 제일 헷갈렸던 부분이었는데, throw는 개발자가 직접 예외를 발생 시키고 싶을 때 쓰는 것이다.
RuntimeException(UnCheckedException)
처리를 위해 쓰는 방식이다.- Spring 프레임 워크를 쓸 때 ExceptionHandler 와 찰떡궁합인 방식이다.
Generic : <>
- 참고
<>
- <>안에 어떠한 타입을 선언해주어 해당 ArrayList, List 등이 사용할 객체의 타입을 지정.
- 이유
- 이는 다룰 객체의 타입을 미리 명시하여 객체의 형 변환을 사용할 필요 없게 함
- 내가 사용하고 싶은 데이터 타입만 사용할 수 있게 해주는 효과
- 원시 타입 이외에도 참조 타입처럼 다양한 Class를 타입으로 지정 해줄 수 있음.
- 멀티 제네릭
- 복수의 타입 class를 지정
- 만약 멀티 제네릭 타입을 지정 후, 하나의 타입만의 nethod만 호출했다면, ERROR
⇒ main 함수에서 선언한 모든 타입의 method를 호출 해야만 함.
- 만약 복수의 class가 하나의 class를 상속 받은 상태라면 타입에 부모 class만 사용해도 무방하다
- 예제 코드
public class Generics { public static void main(String[] args) { ArrayList<Sports> arrList = new ArrayList<Sports>(); arrList.add(new Sports()); arrList.add(new Soccer()); arrList.add(new Baseball()); Sports sports = arrList.get(0); Soccer soccer = (Soccer) arrList.get(1); } } class Sports{} class Soccer extends Sports{} class Baseball extends Sports{}
[JAVA] Java 제네릭(Generics)이란?
[JAVA] Java 제네릭(Generics)이란? 지난 포스팅에서 Java 컬렉션(Collection)에 대하여 알아보았다. 오늘은 Java의 컬렉션을 사용하면서 볼 수 있는 , , 등과 같은 표현인 제네릭(Generics)에 대하여 알아보려
gangnam-americano.tistory.com
HashSet
- Set 인터페이스에서 지원하는 구현 클래스.
- 순서대로 입력되지 않고, 일정하게 유지되지 않는 게 특징.
- HashSet은 null 요소도 허용
- 이 클래스의 가장 큰 특징은 중복을 허용하지 않는다는 것
'CS 기초' 카테고리의 다른 글
[OS] Zero Copy (0) | 2023.07.14 |
---|---|
[CS 기초] 03. 캐시 메모리(Cache Memory) (0) | 2022.12.01 |