[Java] 자료형, 변수와 상수, 형 변환, 배열
자바 복습 및 정리 1P
자료형
(참고 / 8bit = 1byte)
기본 자료형
프로그래밍 언어에서 기본적으로 제공하는 자료형.
1. 정수형
byte : 8bit 정수
short : 16bit 정수
int : 32bit 정수
long : 64bit 정수
2. 부동소수점형
float : 32bit 부동소수점
double : 64bit 부동소수점
실수 리터럴( 소수점을 포함하는 수)은 기본적으로 double 자료형으로 간주된다.
따라서 float 에서는 실수 값을 표현할 때 리터럴 뒤에 F
또는 f
를 붙여서 해당 값을 float 자료형으로 간주하도록 명시해야 한다.
3. 문자형
char : 16bit 유니코드 문자
4. 논리형
boolean : true or false 값을 가지는 자료형
래퍼 클래스(Wrapper Class)
기본 자료형을 객체로 감싸주는 클래스. 기본 자료형 값을 객체 지향적으로 다루기 위해 사용된다.
래퍼 클래스의 목적
- 객체화 : 기본 자료형은 값을 직접 저장하고 메모리를 효율적으로 사용하지만, 객체의 형태로 사용할 때 제약이 따른다. 래퍼 클래스는 기본 자료형 값을 객체로 감싸서 객체의 형태로 다룰 수 있게 해준다.
- Null 표현 : 기본 자료형은 값을 가지지 않는 상태를 나타낼 수 없지만, 래퍼 클래스는 객체이므로 null을 통해 값을 가지지 않는 상태를 표현할 수 있다.
- 메서드 제공 : 래퍼 클래스는 기본 자료형 값을 다루기 위한 다양한 메서드를 제공한다. 예를 들어, Integer 클래스는 정수 값을 다루는 메서드를 제공하며, Double 클래스는 부동 소수점 값을 다루는 메서드를 제공한다
래퍼 클래스 종류
Boolean : boolean 값을 다루는 래퍼 클래스
Byte : byte 값을 다루는 래퍼 클래스
Short : short 값을 다루는 래퍼 클래스
Integer : int 값을 다루는 래퍼 클래스
Long : long 값을 다루는 래퍼 클래스
Float : float 값을 다루는 래퍼 클래스
Double : double 값을 다루는 래퍼 클래스
Character : char 값을 다루는 래퍼 클래스
참조 자료형
객체(Object)의 주소를 저장하는 자료형으로, 프로그래머가 직접 만들거나 자바에서 제공하는 클래스 등을 포함한다. 참조 자료형은 데이터를 가리키는 포인터 개념.
String : 문자열 클래스
Array : 배열 클래스
List : 리스트 인터페이스
Map : 맵 인터페이스
Set : 집합 인터페이스
Class : 클래스 자료형
기본 자료형은 값을 저장하며 스택(stack)에 저장된다.
참조 자료형은 객체의 주소를 저장하며, 해당 객체는 힙(heap)에 저장된다.
참고
기본 자료형과 참조 자료형의 차이점
기본 자료형
- 내장된 데이터 유형으로, 메모리에 값을 직접 저장한다.
- 정수, 실수, 문자, 논리값 등을 포함한다.
- 값을 변수에 할당할 때 해당 값을 직접 저장하며, 변수는 메모리에 값을 직접 보유한다.
- 메모리에 효율적이고 빠른 연산을 위해 사용된다.
- 스택(Stack) 메모리에 저장된다.
참조 자료형
- 객체(Object)나 인스턴스의 주소를 가리키는 데이터 유형이다.
- 클래스, 인터페이스, 배열 등이 참조 자료형에 속한다.
- 변수에 할당하면, 변수는 해당 객체 또는 인스턴스의 메모리 주소를 참조하게 된다. 객체 자체는 힙(Heap) 메모리에 저장된다.
- 객체의 상태와 메서드를 접근하는 데 사용된다.
- 메모리 상에 객체가 저장되어야 하므로, 기본 자료형보다 메모리 사용이 더 크며 성능 측면에서는 약간의 오버헤드가 발생할 수 있다.
- java와 같은 언어에서는 객체의 수명 주기와 가비지 컬렉션을 관리하기 위해 중요한 역할을 한다.
정리
기본 자료형은 값에 직접 접근하여 연산을 수행하며,
참조 자료형은 객체에 대한 참조를 통해 객체의 속성과 메서드에 접근한다.
이에 따라 데이터 유형을 선택할 때는 프로그램의 요구사항과 성능, 메모리 사용 등을 고려하여 적절한 자료형을 선택하는 것이 중요하다.
스택(Stack메모리 와 힙(Heap) 메모리의 차이점
스택 메모리
- 함수 호출과 로컬 변수와 같은 작은 데이터를 저장하는 데 사용된다.
- 메서드 호출 시 호출 스택에 메서드의 로컬 변수와 매개변수 생성된다.
- 메서드가 종료되면 해당 스택 프레임이 제거되어 변수들도 소멸한다.
- 데이터의 크기가 작고, 빠른 액세스와 속도가 요구되는 경우 사용된다.
- 스택 메모리의 할당과 해제는 자동으로 관리되므로 메모리 누수 가능성이 낮다.
- 스택은 LIFO(Last-In-First-Out) 구조를 따른다.
힙 메모리
- 동적으로 할당되는 데이터를 저장하는 데 사용된다.
- 객체, 배열 등의 큰 그기의 데이터와 참조 변수들이 힙 메모리에 저장된다.
- 개발자가 메모리 할당과 해제를 직접 관리해야 하므로 메모리 누수와 더블 프리(Double Free) 같은 오류에 노출될 수 있다.
- 데이터의 수명은 개발자가 제어하며, 메모리 해제를 신경써야 한다.
- 동적 데이터 구조를 지원하며, 객체의 크기가 실행 중에 동적으로 변할 수 있다.
정리
스택 메모리는 작고 빠르게 접근할 수 있는 데이터의 저장을 위해 사용되며,
힙 메모리는 큰 데이터 구조와 동적 데이터의 저장을 위해 사용된다.
변수와 상수
Js에서 let(변수), const(상수)와 같은 역할이다.
변수는 재할당, 재선언이 가능하고 상수는 불가능하다.
상수 이름은 모두 대문자로 짓는게 관습이다.
변수
// 자료형 / 변수명 / 값
int num = 1;
// 문자 하나를 할당할 때는 작은 따옴표('') 문자열은 큰 따옴표("")를 사용한다.
char name = "kim";
boolean taf = true;
재할당
변수를 이미 선언한 후에 다른 값을 할당하는 것을 재할당이라고 한다.
int num = 1;
num = 2;
재선언
변수를 이미 선언한 후에 같은 이름의 변수를 또 다시 선언하는 것을 재선언이라고 한다.
int num = 1; // 변수 선언과 초기화
num = 2; // 변수 값 재할당
int num = 10; // 같은 이름의 변수를 다시 선언 (오류)
// 동일한 스코프 내에서 중복선언 불가
int num = 25; // 첫 번째 스코프에서 age 변수를 선언
if (condition) {
int num = 30; // 두 번째 스코프에서 age 변수를 새롭게 선언
// 이 스코프 내에서는 첫 번째 스코프와는 별개의 age 변수가 사용됨
}
// 첫 번째 스코프와 두 번째 스코프에서 num은 이름은 같지만 다른 변수이다.
상수
// 변수선언과 비슷하지만 앞에 final을 붙인다.
final int MAX_VALUE = 100;
MAX_VALUE = 120; // 재할당 불가 (오류)
형 변환
다른 데이터 타입으로 변환하는 과정.
암시적 형 변환 (Implicit Type Casting 또는 자동 형 변환)
프로그래밍 언어가 자동으로 데이터 타입을 변환하는 것을 말한다.
작은 범위의 데이터 타입을 큰 범위의 데이터 타입에 할당할 때 발생한다.
예를 들어, int를 double에 할당하는 경우가 있다.
int intValue = 10;
double doubleValue = intValue; // int를 double로 암시적으로 형 변환
System.out.println(doubleValue); // 출력: 10.0
명시적 형 변환(Explicit Type Casting 또는 강제 형 변환)
프로그래머가 의도적으로 데이터 타입을 변환하는 것을 말한다.
이때는 데이터 타입을 변환하고자 하는 데이터 타입과 함께 특정 문법을 사용하여 변환한다.
명시적 형 변환은 데이터의 손실을 초래할 수 있으므로 신중하게 사용해야 한다.
double doubleValue = 10.5;
int intValue = (int) doubleValue; // double을 int로 명시적으로 형 변환
System.out.println(intValue); // 출력: 10 (소수 부분이 버려짐)
문자와 숫자간의 형 변환
char charValue = 'A';
int intValue = (int) charValue; // char를 int로 명시적으로 형 변환
System.out.println(intValue); // 출력: 65 (ASCII 코드에서 'A'는 65에 해당)
형 변환과 연산
int intValue = 5;
double doubleValue = 2.5;
double result = intValue + doubleValue; // int와 double의 덧셈 연산에서 int가 double로 자동 형 변환
System.out.println(result); // 출력: 7.5
배열
동일한 데이터 타입의 여러 값을 순차적으로 저장하는 자료구조
배열은 인덱스를 사용하여 각 요소에 접근할 수 있으며, 크기가 고정되어 있어 한 번 생성된 후에 크기를 변경할 수 없다.
배열은 많은 양의 데이터를 효율적으로 관리하고 접근하기 위해 사용한다.
동일한 데이터 타입
배열에 저장되는 모든 요소는 동일한 데이터 타입을 가져야 한다.
고정된 크기
배열을 생성할 때 지정한 크기는 변경할 수 없다. 크기를 변경하려면 새로운 배열을 생성하고 데이터를 복사해야 한다.
인덱스
배열의 각 요소는 0부터 시작하는 인덱스를 가지며, 이를 사용하여 요소에 접근할 수 있다.
예를 들어, 배열의 첫 번째 요소는 인덱스 0, 두 번째 요소는 인덱스 1로 접근한다.
순차적인 저장
배열은 요소가 순차적으로 저장되며, 인덱스를 사용하여 원하는 요소에 접근할 수 있다.
같은 데이터 타입의 연속된 메모리 공간
배열의 각 요소는 메모리에서 연속된 위치에 저장되어 있다. 이는 배열의 빠른 접근을 가능하게 한다.
크기 지정
배열을 생성할 때 크기를 명시하여 초기화한다.
예를 들어, int[] numbers = new int[5];
와 같이 사용한다.
다차원 배열
2차원 배열, 3차원 배열과 같이 더 많은 차원을 가진 배열을 사용할 수 있다.
배열 래퍼 클래스
자바에서는 기본 데이터 타입에 대응하는 배열 래퍼 클래스를 제공하여 객체로 배열을 다룰 수 있도록 한다.
// 정수형 배열 선언 및 초기화
int[] numbers = new int[5];
numbers[0] = 10;
numbers[1] = 20;
// ...
// 문자열 배열 선언 및 초기화
String[] names = {"Alice", "Bob", "Charlie"};
int[] scores = new int[5]; // 성적을 저장할 배열 생성
scores[0] = 85;
scores[1] = 92;
scores[2] = 78;
scores[3] = 95;
scores[4] = 88;
int total = 0;
for (int i = 0; i < scores.length; i++) {
total += scores[i];
}
double average = (double) total / scores.length;
System.out.println("평균 성적: " + average);
int[] scores = new int[5]; // 성적을 저장할 배열 생성
scores[0] = 85;
scores[1] = 92;
scores[2] = 78;
scores[3] = 95;
scores[4] = 88;
int total = 0;
for (int i = 0; i < scores.length; i++) {
total += scores[i];
}
double average = (double) total / scores.length;
System.out.println("평균 성적: " + average);
2차원, 3차원 배열
여러 차원으로 구성된 데이터를 저장하기 위해 사용된다.
각각의 차원은 배열 내에 또 다른 배열을 가지며, 이를 통해 행렬이나 큐브와 같은 구조를 표현하거나 다차원 데이터를 저장할 수 있다.
2차원 배열
행(row)과 열(column)로 구성된 표 형태의 데이터 구조이다.
각 원소는 두 개의 인덱스로 접근하며, 첫 번째 인덱스는 행을, 두 번째 인덱스는 열을 나타낸다.
주로 행렬 연산이나 그리드 데이터를 다룰 때 사용된다.
int[][] matrix = new int[3][4]; // 3행 4열의 2차원 배열 생성
matrix[0][0] = 1;
matrix[0][1] = 2;
// ...
matrix[2][3] = 12;
int value = matrix[1][2]; // 2행 3열의 원소에 접근
3차원 배열
행(row), 열(column), 깊이(depth)로 구성된 데이터 구조이다.
각 원소는 세 개의 인덱스로 접근하며, 첫 번재 인덱스는 행을, 두 번째 인덱스는 열을, 세 번째 인덱스는 깊이를 나타낸다.
주로 복잡한 공간 데이터나 3D 그래픽 연산에서 사용된다.
int[][][] cube = new int[2][3][4]; // 2층 3행 4열의 3차원 배열 생성
cube[0][1][2] = 42;
cube[1][2][1] = 18;
int value = cube[1][2][1]; // 2층 3행 2열의 원소에 접근
n차원 배열 이해하는 꿀팁
코드로만 보면 이해하기 어려울 수 있다.
3차원 배열을 기준으로 보면 행,열,깊이를 x,y,z 축을 생각하며 접근하면 쉽다.
예를 들어 cube[1][2][1] = 18;
이면
x = 1, y = 2, z = 1 위치에 값이 18이다.
댓글남기기