-- [문법] -----------
1. 값 전달
자바에서 대입은 항상 변수에 들어있는 값을 복사해서 전달한다.
만약 변수가 "배열" 이면 해당 배열에는 참조값이 들어있다. 따라서 이 참조값이 전달되는 것이다.
배열 A = 'X001' 일때 A 값을 새로운 인자로 전달하게 되면 A의 value가 아닌 A의 참조값인 'X001' 이 전달된다. 따라서 전달받은 곳에서 newA의 값을 변경하게 되면 동일한 참조값을 갖고 있는 A의 값도 변경되는 것이다.
-> 전형적인 call By Reference, call By Value 와는 조금 다른 양상
2. 클래스 배열 사용하기
#1 : 기본
fruit1 = new Fruit();
fruit1.name = "apple";
fruit2 = new Fruit();
fruit2.name = "orange";
Fruit[] fruits = new Fruit[2];
fruits[0] = fruit1;
fruits[1] = fruit2;
#2 : 클래스 배열 선언과 초기화 동시에 진행
fruit1 = new Fruit();
fruit1.name = "apple";
fruit2 = new Fruit();
fruit2.name = "orange";
Fruit[] fruits = new Fruit[2]{fruit1, fruit2};
#3: 클래스 배열 선언 간결화
fruit1 = new Fruit();
fruit1.name = "apple";
fruit2 = new Fruit();
fruit2.name = "orange";
Fruit[] fruits = new Fruit[]{fruit1, fruit2};
// 혹은 아래와 같이
Fruit[] fruits = {fruit1, fruit2};
3. 기본형과 참조형
기본형 : 자바에서 기본으로 제공하는 데이터 타입 : int, long, dubloe, boolean... 소문자로 시작한다.
참조형 : 기본형을 제외한 타입으로 대문자로 시작한다. 클래스 역시 대문자로 시작하고, 참조형이다. 개발자는 참조형인 클래스만 직접 정의할 수 있다.
- 참조형 String
String은 사실 "클래스" 이다. 하지만 기본형 처럼 문자 값을 바로 대입할수 있으며 서로 더할수 있다. 이는 자주다뤄지는 타입이기 때문에 자바에서 특별한 편의기능을 제공하는 덕분이다.
-- [객체지향] -------
1. 생성자
> 생성자 규칙
- 생성자의 이름은 클래스 이름과 같아야 한다. (따라서 첫 글자도 대문자로 시작한다.)
- 생성자는 반환 타입이 없다. 비워두어야 한다.
- 나머지는 메서드와 같다.
> 기본 생성자
매개변수가 없는 생성자를 기본 생성자라고 한다.
클래스에 생성자가 하나도 없으면 자바 컴바일러는 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어 준다.
public class Fruit {
String name;
int price;
// 자바 컴파일러가 자동으로 만들어 주는 기본 생성자
Fruit(){}
}
하지만, 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다.
public class Fruit {
String name;
int price;
// 사용자가 만든 생성자
void Fruit(String name){
this.name = name
}
}
> 생성자 오버로딩
매개변수가 서로 다른 생성자를 다수 만들 수 있다.
public class Fruit {
String name;
int price;
// name만 받는 생성자
void Fruit(String name){
this.name = name
}
// name과 price를 받는 생성자
void Fruit(String name, int price){
this.name = name
this.price = price
}
}
// 두가지 생성자를 활용한 객체 만들기
Fruit oneFruit = new Fruit("사과"); // 이때 price는 int형의 초기값인 0이 된다.
Fruit twoFruit = new Fruit("오렌지", 1000);
두개 생성자의 공통된 코드를 관리할 수 있다. `this()` 를 통해 생성자 내에서 객체 자기자신의 생성자를 재 호출 한다.
이때 this()는 생성자 코드의 첫번째 줄에서만 사용 가능하다!
public class Fruit {
String name;
int price;
// 생성자 1 : name만 받는 생성자
void Fruit(String name){
this(name, 0) // 매개변수에 따라 생성자 2가 호출된다.
}
// 생성자 2 : name과 price를 받는 생성자
void Fruit(String name, int price){
this.name = name
this.price = price
}
}
-- [메모리 구조와 static]
1. Java의 메모리 영역
- 메소드 영역 : 클래스 정보 보관 (붕어빵 틀)
- 스택 영역 : 실제 프로그램이 실행되는 영역. 메소드 실행할때 마다 하나씩 쌓인다 (붕어빵 만드는 로직)
- 힙 영역 : 객체 (인스턴스) 가 생성되는 영역. new 명령어로 새 객체를 생성하면 해당 영역이 사용된다 (만들어진 붕어빵들)
> 메소드 영역 : 프로그램 실행에 필요한 공통 데이터 관리
- 클래스 정보 : 클래스의 실행 코드 (바이트코드), 필드, 메소드와 생성자 코드 등 모든 실행 코드 존재
- static 영역 : static 변수 보관
- 런타임 상수 풀
> 스택 영역 : 자바 실행 시 하나의 실행 스택 생성
- 지역변수, 중간 연산결과, 메소드 호출 정보 등 포함
- 쓰레드별 하나씩 생성되는 영역
> 힙 영역
- 객체(인스턴스)와 배열이 생성되는 영역
- GC가 일어나는 영역
- 객체가 생성되어 힙 영역이 사용되어도 인스턴스의 메소드는 힙 영역을 사용하지 않고 메소드 영역을 사용한다.
2. Static
> 변수와 생명주기
- 지역 변수(매개변수 포함) : 지역 변수는 스택 영역에 있는 스택 프레임 안에 보관된다. 메서드가 종료되면 스택 프 레임도 제거 되는데 이때 해당 스택 프레임에 포함된 지역 변수도 함께 제거된다. 따라서 지역 변수는 생존 주기가 짧다.
- 인스턴스 변수 : 인스턴스에 있는 멤버 변수를 인스턴스 변수라 한다. 인스턴스 변수는 힙 영역을 사용한다. 힙 영 역은 GC(가비지 컬렉션)가 발생하기 전까지는 생존하기 때문에 보통 지역 변수보다 생존 주기가 길다.
- 클래스 변수 : 클래스 변수는 메서드 영역의 static 영역에 보관되는 변수이다. 메서드 영역은 프로그램 전체에서 사용하는 공용 공간이다. 클래스 변수는 해당 클래스가 JVM에 로딩 되는 순간 생성된다. 그리고 JVM이 종료될 때 까지 생명주기가 이어진다. 따라서 가장 긴 생명주기를 가진다.
-- [Final] -----
값이 최초 한번만 할당되고 이후에 변경 불가능함
1. final 변수의 종류
> final 지역 변수
public static void main(String[] args) {
// final 변수 1
public final String value1;
value1 = "r";
value2 = "b"; // 컴파일 오류
// final 변수 2
public final String value2="a";
value2 = "b"; // 컴파일 오류
}
> final 멤버 변수
- 생성자로 초기화
//final 필드 - 생성자 초기화
public class ConstructInit {
final int value;
// 생성자에서 값을 초기화
public ConstructInit(int value) {
this.value = value;
} }
- 필드 초기화
//final 필드 - 필드 초기화
public class FieldInit {
static final int CONST_VALUE = 10;
final int value = 10;
}
? 필드 초기화에서 final 멤버변수에 `static`을 사용하는 이유
-> 모든 인스턴스가 같은 값을 갖고있는데 중복된 값을 모두 메모리 사용하여 갖고 있다. 이는 명확한 중복이며 개선의 여지가 있는 부분으로 보인다. 따라서 이러한 값은 static을 붙여서 메모리 사용률을 줄이는 것이 효과적이다.
2. final 참조형 변수의 값 변경
// final 로 생성된 참조형 변수
final Data data = new Data()
위와 같은 참조형 변수가 final로 선언되었을때 변수 data를 다른 객체로 재 정의할 순 없다. 하지만 참조형 변수인 Data 인스턴스의 인스턴스 필드는 변경할 수 있다.
// final로 선언된 참조형 변수 Data 객체 data
final Data data = new Data();
data = new Data(); // final 변경 불가 컴파일 오류
data.value = 10; // 가능
data.value = 20; // 가능
'DEV-ing log > Java & Kotlin' 카테고리의 다른 글
[Kotlin] 리팩토링 하며 알아보는 코틀린 문법 : for loop -> elbis -> groupBy -> JPQL + spring data jpa -> Querydsl (0) | 2024.05.01 |
---|---|
[IntelliJ & Kotlin] 빌드 시 Downloading kotlinc-dist? 무한 로딩 오류 (0) | 2024.04.30 |
[Kotlin] 코틀린의 장점 : Null Safe (0) | 2024.04.29 |