본문 바로가기
스터디/whiteship - live-study

[백기선님 라이브 스터디] 2주차 - 자바 데이터 타입, 변수 그리고 배열

by 똧이 2022. 4. 4.
반응형

목차

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

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

리터럴

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

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

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

1차 및 2차 배열 선언하기

타입 추론, var

 

 

 

 


 

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

기본형(primitive type)

분류 타입 기본형 값의 범위 값의 범위
논리형 boolean false false, true 1 byte
문자형 char '\u0000’ ‘\u0000’ ~ ‘\uffff’ (0 ~ 65535) 2 byte
정수형 byte 0 -128 ~ 127 1 byte
short 0 32,768 ~ 32,767 2 byte
int 0 -2,147,483,648 ~ -2,147,483,647 4 byte
long 0L -9,223,372,036,854,775,808 ~ -9,223,372,036,854,775,807 8 byte
실수형 float 0.0f 1.4E-45 ~ 3.4028235E38 4 byte
double 0.0d 4.9E-324 ~ 1.7976931348623157E308 8 byte
  • Stack(스택 영역, 정적 메모리 영역)에 기본타입 변수가 할당되고 변수의 실제 값들이 저장됨
    • 메모리에 고정된 크기로 저장되고 변수에 데이터의 값을 저장
  • 논리형, 문자형, 정수형, 실수형으로 구분됨
    • 논리형(boolean)
      • true와 false 중 하나를 값으로 가짐
      • 조건식과 논리적 계산에 사용
      • 다른 기본형과의 연산 불가
    • 문자형(char)
      • 문자를 저장하는데 사용(정수(유니코드)로 저장)
      • 변수에 하나의 문자만 저장
      • 정수형 또는 실수형과의 연산도 가능
      • Java에서 유일하게 제공되는 unsigned 형태
        • unsigned : 음수 없이 0부터 시작하여 양수 값만 가지는 데이터 형태
    • 정수형(byte, short, int, long)
      • 정수를 저장하는데 사용
      • 주로 int가 사용됨
      • byte는 이진 데이터를 다를 때 사용되며, short는 C언어와의 호환을 위해 추가됨
    • 실수형(float, double)
      • 실수를 저장하는데 사용
      • 주로 double이 사용됨

 

 

래퍼 클래스(Wrapper Class)

기본 자료타입(primitive type)을 객체로 다루기 위해서 사용하는 클래스

primitive type wrapper class
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short
  • 박싱(Boxing)과 언박싱(UnBoxing)

 

  • valueOf()와 parseInt()
    1. Integer.valueOf(String): Integer 클래스를 리턴하기 때문에 산술 연산을 할 수 없다.
    2. Integer.parseInt(String): int 형을 리턴하기 때문에 산술 연산을 할 수 있다.

 

 


 

 

 

레퍼런스 타입(참조 타입, Reference Type)

Primitive Type을 제외한 모든 타입을 포함(문자열, 배열, 열거, 클래스, 인터페이스 등)

  • heap(동적 메모리 영역) 영역에 할당됨
    • 참조타입(Reference Type) 객체들의 주소는 스택 영역에 저장 → Stack 메모리에는 참조값만 있고, 실제값은 Heap 메모리에 존재
    • 크기가 정해져 있지 않음 → 프로그램 실행시 메모리에 동적으로 할당
    • 참조하는 변수가 없으면 자바의 가비지 컬렉터가 제거
  • 기본적으로 java.lang.Object를 상속받으면 reference type이 된다
  • 빈 객체를 의미하는 null이 존재 → 런타임 에러가 발생한다(배열을 null 로 받으면 NullPointerException)

 

 


 

 

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

  1. null 포함 가능 여부
    • primitive type은 null X
    • reference type은 null O
  2. 제너릭 타입 사용 여부
    • primitive type은 제너릭 타입에서 사용 X
    • reference type은 제너릭 타입에서 사용 O
  3. 속도 차이
    • primitive type은 Stack 메모리에 값이 존재
    • reference type은 Stack 메모리에는 참조값만 있고, 실제값은 Heap 메모리에 존재 → 값을 필요로 할 때마다 Unboxing 과정 거치기 때문에 속도가 비교적 느림
    • 예외적으로 엄청 큰 숫자를 복사해야 한다면, 참조값만 넘길 수 있는 reference type이 좋을 수 도 있다.
  4. 메모리 차이
    • primitive type < reference type
  5. Boxing, Unboxing
    • Boxing(박싱): primitive type을 reference type으로 변환 시키는 것
    • Unboxing(언박싱): reference type을 primitive type으로 변환 시키는 것
    • 자바 1.5부터 Auto Boxing / Unboxing 기능 추가

 

 


 

 

리터럴(literal)

=값, 변수나 상수에 저장되는 값 그 자체를 의미

종류 리터럴
논리형 false, true
정수형 123, 0b0101, 077, 0xFF, 100L
실수형 3.14, 3.0e8, 1.4f
문자형 ‘A’, ‘1’, ‘\n’
문자열 “ABC”, “123”, “A”, “true”
정수형
15 → 10진수 리터럴 15
015 → 0으로 시작하면 8진수, 십진수값으로 13 출력
0x15 → 0x로 시작하면 16진수, 십진수값으로 21 출력
0b0101 → 0b로 시작하면 2진수, 십진수값으로 5 출력

실수형
E, e: 10의 제곱을 나타내는 기호

 

 

 


 

 

 

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

변수 선언: 메모리에 데이터를 저장할 공간을 지정

변수타입 변수이름;
ex. int age; // age라는 이름의 변수 선언
ex. int age1, age2, age3, ..., age10; // 같은 형식의 변수 여러 개 동시 선언

 

변수 초기화: 변수를 사용하기 전에 처음으로 값을 저장하는 것

변수타입 변수명 = 초기화할 값;
ex. int age = 25; // 변수 age를 선언하고 25로 초기화
ex. int age1 = 10, age2 = 20, age3 = 30, ..., age10 = 100; // 같은 형식의 변수 여러 개 동시 선언 및 초기화

 

 

 


 

 

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

변수의 스코프

프로그램상에서 사용되는 변수들의 사용 가능한 범위 / 변수가 존재할 수 있는 영역

class Variables{
	int iv; // 인스턴스 변수 -> 클래스 영역
	static int cv; // 클래스 변수(static변수, 공유변수) -> 클래스 영역

	void method(){
		int lv = 0; // 지역 변수 -> 메서드 영역
	}
}
  • 클래스 변수(class variable): 클래스 내의 모든 곳
  • 인스턴스 변수(instance variable): 각각의 인스턴스
  • 지역 변수(local variable): 메소드 안

 

라이프타임(생명주기)

변수가 메모리에 할당된 시점부터 반환되는 시점까지의 시간

프로그램이 함수 내에 진입할 때 메모리에 할당되고, 빠져나갈 때 해제가 일어남

  • 클래스 변수 static 키워드가 붙은 필드 변수, Heap 영역에서 관리
    • 생성: 클래스가 메모리에 올라갈 때
    • 종료: 프로그램이 끝날 때 까지 or 클래스가 메모리에 로드되는 동안((JVM의 Garbage Collector가 제거))
  • 인스턴스 변수 class scope 에서 작성된 변수
    • 생성: 인스턴스가 생성되었을 때
    • 종료: 인스턴스가 메모리에 남아있을 때까지(JVM의 Garbage Collector가 제거)
  • 지역 변수 Method, Loop Scope 등에서 생성되어 사용되는 지역 변수
    • 생성: 변수 선언문이 수행되었을 때
    • 종료: 컨트롤이 선언된 블록을 떠날 때까지

 

 

 


 

 

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

타입 변환

서로 다른 데이터 타입끼리의 연산이 필요로 한 경우 타입 변환이 일어남

기본형과 참조형은 서로 형변환이 불가함

 

타입 변환 종류

  1. 타입 캐스팅(묵시적 타입 변환, 자동 타입 변환, Type Casting)
    • 큰 타입 변수 = 작은 타입 변수
    • 크기가 더 큰 자료형을 크기가 더 작은 자료형에 대입
    • 자동으로 타입 변환
    • 기본형 중에서 자동 형변환이 가능한 방향
      • byte → short / char → int → long → float → double
  2. 타입 프로모션(명시적 타입 변환, 강제 타입 변환, Type Promotion)
    • 작은 타입 변수 = (작은 타입)큰 타입 변수
    • 작은 크기를 가지는 자료형을 큰 크기를 가지는 자료형에 대입
    • 강제로 타입 변환 → 데이터의 손실이 발생 (자바 컴파일러는 오류를 발생시킴)

 

 


 

 

1차 및 2차 배열 선언하기

1차 배열

  • 선언
    타입[] 변수이름;
    int[] score;
    String[] name;
    타입 변수이름[];
    int score[];
    String name[];
  • 생성
    타입[] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언) 변수이름 = new 타입[길이]; // 배열을 생성(실제 저장공간 생성) ex. int[] score; // int 타입의 배열을 다루기 위한 참조변수 score 선언 score = new int[5]; // int 타입의 값 5개를 저장할 수 있는 배열
  • 선언과 동시에 생성
    타입[] 변수이름 = new 타입[길이]; // 배열의 선언과 생성을 동시에 int[] score = new int[5]; // 길이가 5인 int배열

 

2차 배열

  • 선언
    타입[][] 변수이름;
    ex. int[][] score;
    타입 변수이름[][];
    ex. int score[][];
    타입[] 변수이름[];
    int[] score[];

 

  • 생성
    타입[][] 변수이름; // 배열을 선언(배열을 다루기 위한 참조변수 선언)
                변수이름 = new 타입[행][열]; // 배열을 생성(실제 저장공간 생성)
    
                ex.
                int[][] score; // int 타입의 배열을 다루기 위한 참조변수 score 선언
                score = new int[4][3]; // 4행 3열의 2차원 배열 생성
                
  • 선언과 동시에 생성
    타입[][] 변수이름 = new 타입[행][열]; // 배열의 선언과 생성을 동시에
    int[][] score = new int[4][3]; // 4행 3열의 2차원 배열 생성
    

 

 

 


 

타입 추론, var

타입추론

타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능

 

var

  • Java 10부터 지원
  • 지역변수로 사용해야 함
  • 선언과 동시에 반드시 초기화를 해야 함
  • null 초기화하면 작동하지 않음
  • 람다 표현식에는 var 사용할 수 없음
  • 변수 이름에 []를 사용할 수 없고 선언과 동시에 {}에 값 대입을 이용할 수 없음
public class Main {
	public static void main( String[] args) {
	  var hello = "world";
	  var hi;  // 컴파일 에러

		System.out.println(hello instanceof String); // 타입 추론 후 String이면 true가 반환
	}
}

 

 

 

 

 

 


출처

https://coding-factory.tistory.com/547

https://yeastriver.tistory.com/7

https://velog.io/@gillog/원시타입-참조타입Primitive-Type-Reference-Type

https://mine-it-record.tistory.com/100

https://velog.io/@jaden_94/2주차-항해일지

https://lob-dev.tistory.com/entry/Live-StudyWeek-02-자바-데이터-타입-변수-그리고-배열

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=76083001 자바의 정석 - 남궁성

https://young-bin.tistory.com/48

https://itcoin.tistory.com/426

https://github.com/kksb0831/Practice_project/blob/master/Java_Study_02.md

https://morebetterworld.tistory.com/6

https://roeldowney.tistory.com/466

728x90

댓글