학습할 것
1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
2. 프리미티브 타입과 레퍼런스 타입
3. 리터럴
4. 변수 선언 및 초기화하는 방법
5. 변수의 스코프와 라이프타임
6. 타입 변환, 캐스팅 그리고 타입 프로모션
7. 1차 및 2차 배열 선언하기
8. 타입 추론, var
---------------------------------------------------------------
Q1. 프리미티브 타입 종류와 값의 범위 그리고 기본 값
A1. 프리미티브 타입(Primitive type)은 기본형 타입으로 불린다.
특징)
1. 기본값이 있기 때문에 Null이 존재하지 않는다. (만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용한다.)
2. 실제 데이터 값을 저장하는 타입으로 (JVM Runtime Data Area 영역 중) 스택(Stack) 영역에 값이 저장된다.
3. 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생한다.
4. 총 8가지의 기본형 타입을 미리 정의하여 제공한다.
타입 | 할당되는 메모리 크기 | 기본값 | 데이터의 표현 범위 | |
논리형 | boolean | 1 byte | false | true, false |
정수형 | byte | 1 byte | 0 | -128 ~ 127 |
short | 2 byte | 0 | -32,768 ~ 32,767 | |
int(기본) | 4 byte | 0 | -2,147,483,648 ~ 2,147,483,647 |
|
long | 8 byte | 0L | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | |
실수형 | float | 4 byte | 0.0F | (3.4 X 10^-38) ~ (3.4 X 10^38) 의 근사값 |
double(기본) | 8 byte | 0.0 | (1.7 X 10^-308) ~ (1.7 X 10^308) 의 근사값 | |
문자형 | char | 2 byte (유니코드) | '₩u0000' | 0 ~ 65,535 |
Q2. 프리미티브 타입과 레퍼런스 타입
A2. 레퍼런스 타입(Reference Type)은 참조자료형으로 불린다.
특징)
1. 빈 객체를 의미하는 Null이 존재한다.
2. 실제 객체는 힙(Heap) 영역에 저장되며 스택(Stack)영역에 객체의 주소가 저장된다. 따라서 스택 영역에서 주소를
찾아 힙영역의 객체로 찾아가는 형식이다.
( Garbage Collector(가비지 컬렉터) : Heap 영역에 더이상 사용되지 않는 객체를 제거하는 역할 )
3. 클래스를 인스턴스화 시키면 그 인스턴스의 실제 값들은 힙 영역에 저장되고 그 주소가 인스턴스의 이름과 함께
스택 영역에 저장된다.
4. 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. 예를 들어 객체나 배열을 Null 값
으로 받으면 NullPointException이 발생하므로 변수 값을 넣어야 한다.
5. 프리미티브 타입을 제외한 타입들이 모두 레퍼런스 타입이다.
6. 스택 영역에 주소 값으로 4byte가 할당되고 기본값이 Null이다..
Q3. 리터럴
A3. 리터럴(literal)이란 프로그램에서 직접 표현한 값으로 변수에 넣는 변하지 않는 데이터를 의미한다. 5가지 종류의
리터럴이 존재한다.
1. 정수 리터럴
- 정수 리터럴은 기본적으로 int 타입이다. int 타입으로 10진수, 2진수, 8진수, 16진수 표현이 가능하고 long타입으로
표현하려면 뒤에 L을 붙여야 한다.
int 변수 = 15 (10진수)
= 0b101 (2진수 : 0b로 시작)
= 015 (8진수 : 0으로 시작)
= 0x15 (16진수 : 0x로 시작)
long 변수 = 15L (long 타입 : 뒤에 L을 붙여야함)
2. 실수 리터럴
- 실수 리터럴은 기본적으로 double 타입이다. 소수점 형태나 지수 형태로 표현한 값을 의미하고 float 타입으로 표현
하려면 뒤에 f를 꼭 붙여줘야 한다.
double 변수 = 0.1234
= 1234E-4 (뒤에 E-4는 *10^(-4)와 같다)
= .1234D
float 변수 = 0.1234f (float 타입 : 뒤에 f를 붙여야함)
3. 문자 리터럴
- 문자 리터럴은 char 타입이다. 문자 앞뒤에 작은 따옴표 ( ' ) 를 붙여줘야 한다.
char 변수 = '문자' (char 타입 : 앞뒤에 작은 따옴표( ' )를 붙인다.)
4. 논리 리터럴
- 논리 리터럴은 boolean 타입이다. true, false 로 표현 가능하다. (C와 다르게 1을 true, 0을 false로 사용할 수 없다.)
boolean 변수 = true (or false)
= 10 > 0 (주어진 조건이 참이므로 true로 저장)
5. 문자열 리터럴
- 문자열 리터럴은 String 타입인데, 다른 리터럴들과 다르게 레퍼런스 타입(Reference Type)이다. 레퍼런스 타입들
중 String 타입만 리터럴을 지원하는 이유는 new 방식으로 String을 생성하면 스택 영역에 주소가 저장되지만, 문자
열을 바로 입력하면 힙 영역에 String constant pool 이라는 특수한 영역에 값이 저장된다. 이때 동일한 값을 쓰는
경우 new로 생성한 String은 서로 다른 주소 값을 갖지만 문자열을 바로 입력하면 몇개의 변수를 만들어도 동일한
값을 쓰는 경우 같은 주소를 가르킨다. 따라서 프리미티브 타입과 같이 리터럴을 지원할 수 있게 된다.
String 변수 = "abc" (String constant pool에 저장되므로 리터럴 지원 O)
= new String("abc") (new 객체로 만들어서 힙영역에 따로 저장되므로 리터럴 지원 X)
Q4. 변수 선언 및 초기화하는 방법
A4. 변수 선언과 초기화를 따로 알아보자.
1) 변수 선언
변수를 선언하는 것은 저장공간을 확보하겠다는 의미이다. 변수 타입 + 변수 이름 조합으로 선언이 가능한데 이렇게
변수를 선언하면 메모리의 빈 공간에 변수 타입에 알맞은 크기의 저장공간이 확보되고, 변수 이름을 통해 저장공간에
접근이 가능하게 된다.
2) 변수 초기화
변수는 선언이 되면 할당된 메모리에 전역변수(=멤버변수,필드, 인스턴스변수)인 경우에는 기본값이 저장되고, 지역
변수의 경우에는 아무것도 저장되지 않는다. 따라서 대부분의 경우 변수를 사용하기 위해 메모리 안의 값을 초기화해
야 하는데 이를 변수 초기화 라고 하고 3가지 방법으로 변수 초기화가 가능하다.
1. 명시적 초기화 : ' = ' 연산자를 이용하여 선언과 동시에 초기화를 하는 방법이다.
변수타입 + 변수이름 = 데이터 (초기화값) << 이런 방식으로 선언과 초기화가 동시에 가능하다.
2. 블록 초기화 : 명시적 초기화는 인스턴스를 만들면 자동으로 초기화가 이루어지지만 문법상 한줄짜리 구문으로
만 초기화가 가능하다. 따라서 이 부분을 보완한 방법이 초기화 블럭이다. 초기화 블럭에는 2가지
종류가 있다.
(1) 인스턴스 초기화 블록 : 인스턴스 초기화 블록은 다른 명령어 없이 중괄호 { } 내부에 코드를 작성하는 방법
으로 중괄호 { } 내부의 코드가 클래스의 새로운 객체(인스턴스)를 생성될 떄마다
실행 된다. 이는 생성자보다 먼저 수행된다.
(2) 생성자(constructor) : 생성자는 말 그대로 인스턴스 생성시에 생성자 함수 안에서 명시적 초기화가
이루어진다.
(3) 클래스 초기화 블록 : 클래스 초기화 블록은 인스턴스 초기화 블록 처럼 중괄호 { } 내부에 코드를 작성하
는 방법으로 중괄호 앞에 static을 붙여주는 차이점이 있다. 이는 인스턴스 초기화 블
록과 달리 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행되고 모든 인스턴스
에 공통으로 적용된다. (인스턴스 초기화 블록보다 먼저 실행된다.)
3. 초기화 순서
(1) 클래스 변수 : 기본 값 >>> 명시적 초기화 >>> 클래스 초기화 블록
(2) 인스턴스 변수 : 기본 값 >>> 명시적 초기화 >>> 인스턴스 초기화 블록 >>> 생성자
Q5. 변수의 스코프와 라이프타임
A5. 변수의 스코프란 변수를 사용할 수 있는 영역을 말한다. 일반적인 규칙은 변수가 선언된 블록('{ }')내에서만 변수에 접
근 할 수 있다. 라이프 타임은 변수가 메모리에 언제까지 살아있는지를 말하는데, 프로그램이 구동되는 동안 변수가
'값을 담고 있을 수 있는 주기'를 말한다.
1. 선언위치에 따른 변수의 종류
1) 멤버변수 : 클래스 내부에 선언되는 변수(클래스 내부 and 블럭 외부)로 클래스 변수와 인스턴스 변수로 나뉜다.
- 클래스 변수 : 멤버변수에 static 키워드를 붙이면 클래스 변수가 되며 한 클래스의 모든 인스턴스가 값을 공유
한다. 클래스 변수는 인스턴스 생성시 생성되지 않고, 클래스가 메모리에 올라갔을 때 선언되기
때문에 인스턴스에서 언제든 바로 접근해서 사용할 수 있다. 그렇기에 어디서나 접근할 수 있는
전역변수의 성격을 가진다.
- 인스턴스 변수 : 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어진다. 그렇기에 인스턴스 변
수 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야 한다. 인스턴스 별로 별도
의 저장공간을 확보하기에 인스턴스 별로 다른 값을 가질 수 있다.
2) 지역변수 : 멤버변수가 아닌 모든 변수를 말한다. 클래스 내부에 있는 블록 내에서 선언되면 그 안에서만 사용 가
능하며 블럭이 종료되면 함께 소멸된다.
2. 변수에 따른 스코프와 라이프타임
변수의 종류 | 선언 위치 | 스코프 | 라이프타임 |
클래스 변수 | 클래스 영역 | 클래스 전체 | 클래스가 메모리에 올라간 후 프로그램이 끝날 때 까지 |
인스턴스 변수 | 클래스 영역 | static 블록과 static 매서드를 제외한 클래스 전체 | 인스턴스가 생성 후 메모리에 살아있을 때 까지 |
지역 변수 | 메소드, 생성자, 초기화 블럭 내부 등 | 변수가 선언된 블록 내부 | 변수 선언 후 블록을 벗어날 때 까지 |
Q6. 타입 변환, 캐스팅 그리고 타입 프로모션
A6. Java에서는 연산을 수행할 때 자료형을 일치시켜줘야 하는데 이를 타입 변환이라 한다. 타입 변환에는 두가지 종류가 있다.
1. 타입 캐스팅 (강제, 명시적 타입 변환) : 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개서 저장하는 것을 강
제 타입 변환 , 타입 캐스팅이라 한다. 이 경우 데이터를 담는 그릇이 작아지므로 데이터의 크기가 자료형보다 큰 경우
값의 변형이 올 수 있다. 타입 캐스팅을 하는 방법은 간단한데 변환하고자 하는 변수나 리터럴 앞에 괄호안에 원하는
타입을 적어서 붙여주면 된다. / ex) (자료형) 변수 or 리터럴
2. 타입 프로모션 (자동, 묵시적 타입 변환) : 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 의미한다. 크
기가 작은 데이터 타입에서 넓은 타입으로 형변환 할 때 값 손실이 없기에 두 타입 중 표현 범위가 더 넓은 쪽으로 형변
환 된다.
기본형의 자동 형변환의 방향
(출처 : https://catsbi.oopy.io/6541026f-1e19-4117-8fef-aea145e4fc1b )
Q7. 1차 및 2차 배열 선언하기
A7. 배열 : 동일한 타입의 데이터를 연속된 공간에 저장하기 위한 자료구조.
1. 1차 배열의 선언 : int [] array = new int [10] (int 자료형을 10개 저장할 수 있는 배열 생성)
1차 배열에 값 넣기 : array[i] = 1 (위에서 생성한 배열 array의 i번째 공간에 1 저장
2. 2차 배열의 선언 : int [][] array = new int [i][j] ( int 자료형을 저장할 수 있는 i*j 크기의 배열을 생성)
2차 배열에 값 넣기 : array[i][j] = 1 (위에서 생성한 배열 array의 i행 j열 공간에 1 저장)
Q8. 타입 추론, var
A8. 타입추론 : 변수의 타입을 명시적으로 적어주지 않고도, 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하
는 것이다.
Var : 타입추론의 방법으로 자료형 자리에 var을 쓰면 초기화된 값을 보고 컴파일러가 자동으로 자료형을 추론해준다.
1. Var 사용
1) Var는 초기화 없이 사용할 수 없다. / var i ; << 초기화값이 없으므로 오류 (명시적 초기화 필요)
2) Var타입 변수에는 null 값이 들어갈 수 없다. / var i = null; << null 값이 들어가서 오류
3) Var타입은 로컬 변수에만 선언이 가능하다. / private var i = "Yes" ; << 멤버 변수에 사용 불가능
5) 배열을 선언할 때, var 대신 타입을 명시해줘야 한다. / var arr = {1,2,3} << 명시적인 타입 지정해야함
6) 중간에 타입 변경이 불가능하다.
Generic : 매개변수 타입이나 리턴 타입에 대한 정의를 외부로 미루는 방법이다. 타입에 대해 유연성과 안정성을 확보하
고 런타임 환경에 아무런 영향이 없는 컴파일 시점의 전처리 기술이다.
Java 공부 3주차 과제 (0) | 2022.12.22 |
---|---|
Java 공부 1주차 과제 (0) | 2022.12.09 |