목표
코딩테스트 공부하는 중, 이진탐색 문제를 풀면서 언제 (long) 을 써야하고 언제 Long.parseLong을 써야하는지를 암기적으로 알고 있는 상태를 발견 후, 이를 정확히 알고 넘어가고자 포스팅한다.
원시타입, 참조타입
⭐ 원시타입 (primitive type)
정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입
ex) Boolean Type (boolean), Numeric Type(short, int, long, float, double, char)
⭐ 참조타입 (reference type)
객체(Object)의 번지를 참조(주소를 저장)하는 타입으로 메모리 번지 값을 통해 객체를 참조하는 타입
example) 문자열, 배열, 열거, 클래스, 인터페이스
ex) Class Type, Interface Type, Array Type, Enum Type 등
⭕ 정적 메모리 스택 영역 (Stack)
- 기본(원시) 타입 변수가 할당되고, 변수의 실제 값들이 저장됨
- 참조 타입의 변수들은 스택 영역에서 힙 영역에 생성된 객체들의 주소 값을 저장하고 있음.
- 객체 안의 메소드의 작업이 종료되면 할당되었던 메모리 공간은 반환되어 비워진다.
⭕ 동적 메모리 힙 영역 (Heap)
- 객체와 배열 등의 참조타입들이 저장된다.
- 이 참조타입들의 주소를 스택 영역에 저장한다.
- 기본타입 변수와 다르게 크기가 정해져있지는 않다.
- 프로그램 실행시, 메모리에 동적으로 할당된다.
- 참조하는 변수가 없다면 자바의 gc가 제거한다.
⇒ Java에서 실제 객체는 힙영역에 저장되며, 참조 타입 변수는 스택 영역에 실제 객체들의 주소를 저장하여 객체를 사용할 때마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.
캐스팅이란
- 자바의 상속 관계에 있는 부모와 자식 클래스 간 서로 형변환 진행
- 부모 클래스는 자식 클래스를 모두 갖고 있으나, 자식 클래스는 일부만 갖고 있을 것
- 그러므로, 형변환(캐스팅)을 통해 사용할 수 있는 멤버의 개수를 조절하는 것으로 이해하면 된다.
- 업캐스팅 = 개수 up
- 다운캐스팅 = 개수 down
class Parent {
String name;
int age;
}
class Child extends Parent {
/*
String name;
int age;
*/
int number;
}
Parent p = new Parent();
Child c = new Child();
Parent p2 = (Parent)c; // 업캐스팅 - 자식에서 부모로
Child c2 = (Child)p2; // 다운캐스팅 - 부모에서 자식으로
- 부모 클래스 : Parent
- 자식 클래스 : Child
⚠️ 다운 캐스팅 ≠ 업캐스팅의 반대
다운 캐스팅은 부모 클래스로 업캐스팅된 자식 클래스를 다시 복구하여, 본인의 필드와 기능을 회복하는 단계
⇒ 원래 있던 기능을 회복하기 위해 다운캐스팅을 진행
class Unit { //부모 클래스
public void attack() {
System.out.println("유닛 공격");
}
}
class Zealot extends Unit { //자식 클래스
public void attack() {
System.out.println("찌르기");
}
public void teleportation() {
System.out.println("프로토스 워프");
}
}
public class Main {
public static void main(String[] args) {
Unit unit_up;
Zealot zealot = new Zealot();
unit_up = zealot; // 업캐스팅
// * 다운캐스팅(downcasting) - 자식 전용 멤버를 이용하기위해, 이미 업캐스팅한 객체를 되돌릴때 사용
Zealot unit_down = (Zealot) unit_up; // 캐스팅 연산자는 생략 불가능. 반드시 기재
unit_down.attack(); // "찌르기"
unit_down.teleportation(); // "프로토스 워프"
}
}
자동 형변환 (묵시적/암시적 형변환)
- 프로그램 실행 도중에 컴파일러가 자동적으로 타입 변환하는 것
- 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장되는 경우
int num = 100;
long answer = num; //(long > num)
'BACKEND > JAVA & SPRING' 카테고리의 다른 글
@SpringBootTest, @MockBean, Mockito, Junit 등 테스트에 대해서… (1) | 2024.12.15 |
---|---|
벌크연산을 통한 update 성능 개선 시도 그리고 일반 연산과의 비교 (0) | 2024.08.07 |
MultipartFile와 Ajax를 활용한 파일 업로드 (0) | 2024.08.01 |
Transaction의 전파 (feat. REQUIRES_NEW의 문제점) (0) | 2024.07.31 |
[Spring Security + JWT + OAUTH2] 카카오/네이버 외부 로그인 구현 (0) | 2024.04.30 |