Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
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
Archives
Today
Total
관리 메뉴

성빈

[JAVA] 2주차 자바 데이터타입, 변수, 배열 본문

JAVA

[JAVA] 2주차 자바 데이터타입, 변수, 배열

성빈나 2023. 7. 24. 19:11

목표

자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

학습할 것

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • 타입 추론, var

프리미티브 타입 종류와 값의 범위 그리고 기본 값

정수형 byte 0 -128 ~ 127 1byte
short 0 -32,768 ~ 32,767 2byte
int 0 -2,147,483,648 ~ 2,147,483,647 4byte
long 0L 9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 8byte
실수형 float 0.0f (3.4 X 10-38) ~ (3.4 X 1038) 의 근사값 4byte
double 0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값 8byte
문자형 char '\u0000' 0 ~ 65,535 2byte
논리형 boolean FALSE false, ture 1byte
  • int와 float의 차이 (같은 4byte임에도 값의 범위가 차이나는 이유 )
  • float와 double의 차이 (정밀도)
  • float은 7자리, double은 15~16자리 까지 표현할 수 있다. 따라서 더 높은 정밀도가 필요하다면 double을 사용해야 한다.

프리미티브 타입과 레퍼런스 타입

  • 기본형 타입 (Primitive type)
    • byte, short, signed/unsigned int, signed/unsigned long, float, double, boolean, char
    • 기본값이 있기 때문에 null이 존재하지 않음
    • 실제 값을 저장하는 공간으로 Stack 메모리에 저장
  • 참조형 타입 (Reference type)
    • 기본형(primitive) 타입을 제외한 타입들이 모두 참조형 타입
    • 빈 객체를 의미하는 null 존재
    • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 Heap 메모리에 저장
    • 배열/클래스/인터페이스에 대한 레퍼런스

리터럴(literal)

리터럴은 변수에 넣는 변하지 않는 데이터를 의미한다. 정수, 실수, 문자, 논리, 문자열 모두 리터럴이 있다.

  • 정수 리터럴
    • 정수 리터럴은 int타입으로 자동 컴파일된다.
int n = 15; // 십진수:15
int m =  015; // 8진수:015, 10진수:13
int k = 0x15; // 16진수:0x15, 10진수:21
int b = 0b0101; // 2진수:0b0101, 10진수:5

 

10진수 0으로 시작하지 않는 수 15 → 10진수 15
8진수 0으로 시작하는 수 015 → 10진수 13
16진수 0x로 시작하는 수 0x15 → 10진수 21
2진수 0b로 시작하는 수 0b0101 → 10진수 5
  • 실수 리터럴
    • 소수점 형태나 지수 형태로 실수를 표현한 값
    • double 타입으로 자동 처리된다.
    • 숫자 뒤에 f나 F를 붙이면 float, d나 D를 붙이면 double 타입으로 강제 변환할 수 있다.
double d = 0.1234;
float f = 0.1234f; // f = 0.1234로 하면 컴파일 오류
double w = .1234D; //0.1234와 동일
  • 문자 리터럴
    • 단일 인용부호(’ ‘)로 문자를 표현하거나, \u 다음에 문자의 유니코드 값을 사용하여 표현한다.
char a = 'A';
char b = '글';
  • 문자형 리터럴
    • 이중 인용부호(” ”)로 표현
    String str = "good";
    
  • 특수문자 리터럴
‘\b’ 백스페이스 ‘\r’ 캐리지 리턴
‘\t’ ‘\”’ 이중 인용부호
‘\n’ 라인피드 ‘\’’ 단일 인용부호
‘\f’ 폼피드 ‘\\’ 백슬래시

 

  • 논리 리터럴과 boolean 타입
    • true, false 두 개밖에 없다.
    • boolean 타입의 변수에 직접 치환하거나 조건문에 사용한다.
    • C/C++과 달리 Java에서 숫자를 참, 거짓으로 사용 불가하다.
boolean a = true;
boolean b = 10 > 0; // 10>0가 참이므로 b값은 true
boolean c = 1; // 타입 불일치 오류
while(ture) { // 무한루프. while(1)로 하면 안됨.
	...
}

 

변수 선언 및 초기화하는 방법

변수는 데이터를 저장하는 공간이다. 변수를 선언하면 타입 크기의 메모리가 할당되며, 프로그램은 실행 중에 값을 쓰고 읽는 공간으로 사용한다.

 

● 변수 선언

: 데이터 타입과 변수 이름으로 변수를 선언한다.

int price; // 데이터 타입과 변수이름
char c1, c2, c3 // 같은 타입의 변수를 여러 개 선언하려면 콤마로 분리한다.

● 변수 선언과 동시에 초기화

: 변수 선언과 동시에 초깃값을 지정할 수 있다.

int radius = 10;
char c1 = 'a', c2 = 'b', c3 = 'c';
double weight = 75.56;

 

변수의 스코프와 라이프타임

  • 변수의 스코프
    • 스코프란 변수를 사용할 수 있는 영역을 의미한다.
    • 일반적인 규칙은 변수가 선언된 블록 내에서만 변수에 접근할 수 있다.
    • 블록은 { }을 말하는데, Java에서 Class와 Method가 블록을 가진다.
  • 변수의 라이프 타임
    • 라이프 타임은 이러한 변수가 유효한 시간을 말하는데,
    • 프로그램이 구동되는 동안 변수가 '값을 담고 있을 수 있는 주기'를 말한다.
  • 변수의 종류
    • 변수의 스코프와 라이프 타임은 변수의 종류에 따라 상이하다.
    • 이는 변수가 선언된 위치에 따라 세 가지 영역으로 나눌 수 있다.
      1. 클래스 변수
      2. 인스턴스 변수
      3. 지역 변수

    클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때 프로그램이 끝날 때까지 클래스 전역
    인스턴스 변수 클래스 영역 인스턴스가 생성될 때 객체가 메모리에서 활용될 때까지 static 메소드를 제외한 클래스 모든 영역
    지역변수 메소드 영역 변수 선언문이 수행되었을 때 블록을 벗어났을 때까지 메소드 안

 

타입 변환, 캐스팅 그리고 타입 프로모션

  • 타입 변환
    • 데이터 타입을 다른 데이터 타입으로 변환하는 것을 의미한다.
    • 자동 타입 변환과 강제 타입 변환으로 나뉜다.
    1. 자동 타입 변환 (묵시적 타입 변환, 타입 프로모션)
      • 값의 허용 범위가 작은 타입이 큰 타입으로 저장될 때 발생한다.
      • 자동 형 변환이 이루어지는 순서 : byte < short < char < int < long < float < double
    2. 강제 타입 변환 (명시적 타입 변환, 캐스팅)
      • 개발자가 강제로 타입 변환을 지시하는 경우이다.
      • 표현 방식 : (변환할 타입) 변환할 데이터
      • 문제점 : 데이터 손실이 발생할 수 있다.
      • 강제 변환을 하면 컴파일 오류가 발생하지 않지만, 300에서 256을 초과한 만큼, 44(300%256=44)가 변수 b에 저장되어 데이터 손실이 발생하게 된다.또한, 실수를 정수로 강제 변환하면 소수점 이하의 손실이 발생한다.
        • double d = 1.9; int n = (int)d; // 강제 타입 변환으로 n=1이 됨
        • int n = 300; byte b = n; // 컴파일 오류. int 타입은 byte 타입으로 자동 변환되지 않음 byte b = (byte)n; // n을 byte 타입으로 강제 변환. b=44
int num1 = 1; 
int num2 = 4; 
double result1 = num1 / num2; 
double result2 = (double) num1 / num2; 

System.out.println(result1); 
System.out.println(result2);

 

1차 및 2차 배열 선언하기

  • 배열
    • 여러 개의 데이터들을 인덱스 구조에 저장을 한다.
    • 배열의 길이는 한번 생성하면 줄이거나 늘릴 수 없고 같은 타입들만이 배열의 원소로 사용된다.
    • 배열도 결국은 타입에 따라 default값으로 채워진다.
      • 참조의 경우 null
      • int / short / byte / long의 경우 0
      • float / double 의 경우 0.0
      • bool의 경우 false
      • char의 경우 \\u0000

다차원 배열, 1차원 배열 vs 2차원 배열 vs 3차원 배열(비교) (tistory.com)

  • 1차원 배열
    • 선언하기 타입[] 배열이름 = new 타입[배열길이];
      • 배열 선언, 생성, 할당을 동시에 하는 방법
      • int[] score = {10, 11, 12}; // 또는 int score[] = {10, 11, 12};
      • 배열 선언 후에 생성과 할당을 하는 방법
      • int score[]; string name[]; // 배열 선언 score = new int[] {10, 50, 100}; name = new string[] {"white", "ship}; // 생성과 할당
      • 배열 선언 후 -> 생성 후 -> 할당을 하는 방법
      • int score[]; // 선언 score = new int[3]; // 생성 score[0] = 10; score[1] = 50; score[2] = 100; // 할당
  • 2차원 배열
    • 선언하기 타입[][] 배열이름 = new 타입[배열길이][배열길이];
    int[][] intArray = new int[2][3]; // 2행 3열의 2차원 배열 생성
    char charArray [][] = new char[5][5]; // 5행 5열의 2차원 배열 생성
    double doubleArray[][] = {{0.01, 0.02}, {0.03, 0.04}}; // 2행 2열의 2차원 배열 생성
    

 

타입 추론, var

  • 타입 추론
    • 변수 타입을 명시하지 않고 컴파일러가 데이터 타입이 무엇인지 추론한다는 것을 의미
    • Java10부터 지역 변수를 선언할 때 변수의 타입 대신 var 키워드를 사용할 수 있다.
    var price = 200; // price는 int타입으로 결정
    var name = "apple" // name은 String 타입으로 결정
    var name; // 컴파일 오류. 변수 선언문에 초깃값이 주어지지 않으면 타입을 추론할 수 없음
    

참고자료

 

'JAVA' 카테고리의 다른 글

[JAVA] 3주차 연산자  (0) 2023.10.27
[JAVA] 1주차 JVM  (0) 2023.07.17