java - 변수 / 자료형

yunzivv·2025년 3월 4일

JAVA 기초

목록 보기
2/23

1. 변수(Variable)


데이터를 저장할 수 있는 메모리 공간이다. 변수 하나당 데이터 타입에 해당되는 하나의 값만 저장할 수 있다. 프로그램은 변수를 통해 특정 주소에 값을 저장하고 읽는다.

변수 명명규칙


1) 영어, 숫자, _, $로 구성
2) 첫글자 숫자 작성 불가
3) 대소문자 구분
4) 길이제한 없음
5) 특수기호는 _, $ 제외 사용 불가
6) 공백 포함 불가
7) 예약어 사용 불가

변수명은 식별하기 쉽도록 성격을 담아 작성하는 것이 좋다.


📌 업데이트 : 변수의 종류


변수의 종류는 선언 위치에 따라 전역변수지역변수로 구분된다.

선언 위치에 따른 변수의 종류

변수는 선언 위치에 따라 전역변수와 지역변수로 나뉘어진다.

1) 전역변수

  • 어디서든 호출하면 사용할 수 있는 변수
  • 다른 메서드에서도 공통적으로 사용이 가능하다.
  • 프로그램이 시작되면 생성되고 프로그램이 끝나면 죽는다.

2) 지역변수

  • 지역변수가 선언된 메서드 내에서만 사용할 수 있는 변수
  • 메서드가 실행되면 생성되고 메서드가 끝나면 지역변수도 생명이 끝난다.
public class Main {
	int a = 20; // 전역변수
    
    public static void main(String[] args) {
        int a = 10; // 지역변수
        System.out.println(a)
        }
  }
출력
10

같은 타입과 같은 변수명의 전역변수와 지역변수가 있을 때 에러가 일어나지 않는다. 프로그램은 전역변수 a지역변수 a를 각각 다른 객체로 보고있다.
이런경우 지역변수가 우선적으로 처리되어 지역변수 a에 저장된 10이 출력된다.

2. 자료형(Type)


변수에 저장할 수 있는 데이터의 형태이다. 변수 선언 시 변수명 앞에 자료형 정의하여 사용한다.
변수에는 무조건 자료형이 필요하다.

  • 작성 예시
int a = 5;
char i = "문자열";

기본형(Primivite type)


기본 자료형의 종류

형태예약어크기기본값
논리값boolean1bytefalse
문자열char2byte'\u0000'
정수형byte1byte0
정수형short2byte0
정수형int4byte0
정수형long8byte0l
실수형float4byte0.0f
실수형double8byte0.0
  • float 선언
float a = 11.1f;
  • double 선언
double a = 11.1;

기본자료형의 크기와 타입, 기본값은 외워두는 것이 좋다.

📌 업데이트 : 실수 자료형의 계산 오차


📌 업데이트 : 타입 변환

1. 자동 타입 변환

작은 타입이 큰 타입으로 저장될 때는 별도 지시 없이 자동으로 타입이 변환된다.
byte < short < int < long < float < double

short snum = 3;
double dnum = snum;

byte a = 1;
byte b = 2;
int i = a + b; // a와 b의 타입이 int로 변환

2. 강제 타입 변환

1) 큰 타입을 작은 타입으로 변환

double dnum = 3.14;
int inum = (int) dnum; // 정수에 해당하는 3만 저장

2) 문자열 타입 변환

// 문자열 - > 숫자 : parse()
String s = "100";
int inum = Integer.parseInt(a);

// 숫자 -> 문자열 : valueOf()
short snum = 15;
String s = String.valueOf(snum);

캐스팅에 대해 더 자세히 정리해서 아래에 첨부한다.
캐스팅


참조형(Reference type)


참조형은 위에서 언급한 기본형 8가지를 제외한 모든 타입이다.
실제 값을 갖는 것이 아닌 데이터가 저장된 메모리의 주소값을 가지는 자료형이다.

📌 업데이트 : 프로그래머스 분수의 합


풀이

  1. 변수 4개에 분자1, 분모1, 분자2, 분모2를 매개변수로 전달 받는다.
  2. return할 배열변수 answer의 길이는 2로 정한다. (합한 결과의 분자와 분모 두가지)
  3. 다음은 4숫자의 최대공약수를 구해서 계산하기를 먼저 떠올렸다. 이 방법은 코드가 너무 복잡해 질 것 같다.
    3-0. 두 분수를 통분하여 더한다.
    3-1. 분자 : renumer분자1 * 분모2 + 분자2 * 분모1을 계산하여 저장한다.
    3-2. 분모 : redenom분모1 * 분모2을 계산하여 저장한다.
  4. 분자와 분모의 최대공약수를 찾아 약분한다.
    4-1. i는 2부터 분모까지 증가한다. (최대공약수를 구하기 위함이니 분자를 적어도 상관없다.)
    4-2. i가 증가하다가 분자와 분모의 공약수면 answer에 분자와 분모를 순서대로 저장한다.
    4-3. 공약수 중 가장 큰 최대공약수를 만났을 때의 값이 최종적으로 저장된다.
  5. 만약 공약수를 찾지 못해서 answer[0]에 저장된 값이 없다면
  6. 그냥 분자와 분모를 저장한다.
// 프로그래머스 분수의 덧셈
class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) { //1
        int[] answer = new int[2]; // 2
        int renumer = numer1 * denom2 + numer2 * denom1; // 3-1
        int redenom = denom1 * denom2; // 3-2
        
        for(int i = 2; i <= redenom; i++){ // 4-1
            if(renumer % i == 0 && redenom % i == 0){ //4-2
                answer[0] = renumer / i; // 4-3
                answer[1] = redenom / i;; // 4-3
            }
        }
        if(answer[0] == null){ // 5
            answer[0] = renumer; // 6
            answer[1] = redenom;
            }
         
        
        return answer;
    }
}

테스트결과

/Solution.java:13: error: bad operand types for binary operator '=='
        if(answer[0] == null){
                     ^
  first type:  int
  second type: <null>
// if(answer[0] == null) 문장에서 first type은 int고 second type은 <null>이다.

배열은 참조타입이니까 참조타입의 기본값인 null이 저장되어 있을 것이라고 생각했는데, 타입이 맞지 않는다고 한다.

해결

if문만 떼어서 보자

if(answer[0] == 0){ // 여기
    answer[0] = renumer;
    answer[1] = redenom;
    }

null0으로 수정했더니 통과됐다.
배열은 참조형이지만 배열의 요소는 int의 자료형을 갖기 때문에 기본값 0으로 초기화된다.

그렇다면 null상태인 배열은 어떤 상태를 말하는 걸까

  • 예시코드 1
String [] answer; // 선언만 한 상태
System.out.println(answer[0]); // 오류발생

즉 배열변수만 생성 했을 때, 변수 자체가 null상태 인 것이다. 이 때 answer[0]에 접근하려고 하면 NullPointerException 오류가 발생한다.

  • 예시코드 2
String [] answer = new String[크기]
System.out.println(answer[0]);
출력
null

예시코드 2는 String배열을 선언하고 new String[크기]로 초기화 해준 상태다.
String배열의 요소는 참조타입인 String이다. 그래서, 배열 요소는 기본값으로 null값을 갖게 된다. 실제로 출력해보면 null이 출력된다.

문제를 풀기 위해 알고리즘을 구상하는 것도 어려웠는데 작은 요소까지 어려운 문제였다. null일 때 오류가 나서 Null로도 고쳐봤는데 그건 해결이 되지 않아 자료를 많이 찾아봤다...

참고 자료


Null

0개의 댓글