Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 개발바닥
- 데이터 송수신
- 자바
- 역캡슐화
- 백준 1712
- 인터페이스
- l3 스위치
- 10866
- 물리구성도
- 계층화
- AWS CLF
- TCP/IP
- 1764
- aws 자격증
- 유선LAN
- 파이썬
- 다형성
- 남궁성
- 자바의 정석
- 상속
- network
- modifiers
- 백준 2775
- 인프콘
- 파이썬 1712
- 네트워크
- 논리구성도
- java
- 프로토콜
- 테슬라폰
Archives
- Today
- Total
병훈's Blog
[Java] 초기화 (initialized) 본문
- 참고 : Java의 정석
초기화 (initialized)
초기화 : 변수를 선언하고 처음으로 값을 저장하는 것
java에서 맨 처음 배우는 변수의 초기화는 이렇게 간단했어요.
// 메인메소드 내부의 코드라 가정
int num; // 선언
num = 10; // 초기화
int num_2 = 20; // 선언과 초기화를 동시에
int i; // 지역변수 선언만 하고, 초기화는 안 함
System.out.println(i); //출력 -> 에러 발생
여기서 마지막 두 줄을 실행시키면 아래 에러가 납니다.
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The local variable i may not have been initialized
==> 그 지역변수 i 는 아마 초기화 되지 않았습니다.
지역변수는 초기화하지 않고 사용하면 안 된다는 뜻이죠.
객체 안에서 변수의 초기화는 다르다는데요. 무엇이 다를까요?
Car car; // 참조변수 선언
car = new Car(); // 인스턴스를 생성하며 참조변수 초기화 (주소 저장)
Car car_2 = new Car(); // 선언과 초기화를 동시에
class Car {
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car() {}
}
여기 변수들은 클래스 바로 아래에서 선언되었으므로 전역변수 입니다. 일단은 지역변수가 아니죠.
그리고 이런 전역변수들은 인스턴스가 생성될 때 초기화 되지 않았더라도 기본값이 저장됩니다.
- 참조형에는 null이
- 논리형에는 false가
- 그 외에는 0이나 0.0이 저장됩니다.
ex) 사진 예
Console 창에 출력된 것을 보면,
String 타입의 color는 null로
int 타입의 door는 0으로 출력되었죠?
- 지역변수 는 사용 전에 꼭 초기화를 해주어야 한다!!
- 전역변수 (멤버변수 or 인스턴스변수 or 클래스변수)는
각 타입의 기본값으로 자동 초기화 되므로 초기화를 생략할 수 있다.
근데 여기서 초기화가 끝난 것이 아닙니다.
멤버변수의 초기화
- 명시적 초기화
변수에 값을 저장하는 코드
// 지금까지 봐왔던 기본적인 방식이에요
int n = 10; // 기본형 변수의 초기화
Car car = new Car(); // 참조형 변수의 초기화
- 생성자를 통한 초기화
인스턴스 생성과 동시에 생성자를 통해 초기화한다.
// 지난 시간에 배운 내용이죠
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
- 초기화 블럭을 통한 초기화
- 인스턴스 초기화 블럭 : { }
- 클래스 초기화 블럭 : static { }
" 어서 와. 초기화 블럭은 처음이지? "
" 초기화 방법이 왜 이렇게 많은 거야!! 순서는 어떻게 되는 거지? "
차근차근 알아가보자고yo
초기화 순서
class InitTest {
static int cv = 1; // 1-1,2 명시적 초기화
int iv = 1; // 2-1,2 명시적 초기화
static { cv = 2; } // 1-3 클래스 초기화 블럭
{ iv = 2; } // 2-3 인스턴스 초기화 블럭
InitTest() { // 2-4 생성자
iv = 3;
}
}
1. 클래스 초기화
static이 붙은 클래스변수, 클래스 메소드, 클래스 초기화 블럭은
클래스가 로딩될 때 실행되므로 가장 먼저 실행돼요.
- 기본값 저장(= static 변수 선언):
static 키워드가 붙은
자료형(Data Type)과 변수명이 선언되는 순간,
해당 자료형의 기본값이 저절로 저장됩니다. - 명시적 초기화:
그리고 우변의 값이 변수에 저장되는 명시적 초기화가 진행되는 것이죠.
우변의 값이 기본값을 덮는 겁니다. - 클래스 초기화 블럭:
그 후에 클래스 초기화 블럭이 실행됩니다.
2. 인스턴스 초기화
인스턴스는 코드가 실행되고,
new로 인스턴스가 생성될 때 실행돼요.
- 기본값 저장(= 변수 선언):
마찬가지로 자료형(Data Type)과 변수명이 선언되는 순간,
해당 자료형의 기본값이 저절로 저장됩니다. - 명시적 초기화:
그리고 우변의 값이 변수에 저장되는 명시적 초기화가 진행되는 것이죠.
우변의 값이 기본값을 덮는 겁니다. - 인스턴스 초기화 블럭:
그 후에 클래스 초기화 블럭이 실행됩니다.
생성자보다 먼저 실행됩니다!! - 생성자:
일단 생성자는 new로 인스턴스를 생성할 때 호출되므로 static 키워드가 붙을 수 없어요.
저는 지금까지 생성자가 가장 먼저 실행되는 줄 알았는데,
생성자가 가장 나중에 실행됩니다.
오늘도 한 걸음 더 나아갔군요!!
화이팅입니다!
728x90
728x90
'Java' 카테고리의 다른 글
[Java] 오버라이딩 (Overriding) (0) | 2022.09.26 |
---|---|
[Java] 상속 (Inheritance) (0) | 2022.09.26 |
[Java] this (0) | 2022.09.25 |
[Java] 생성자 (Constructor) (0) | 2022.09.25 |
[Java] 메소드 오버로딩 (Method Overloading) (0) | 2022.09.25 |