프로그래밍/Java

[Java] 2. 변수

Jepetto 2023. 2. 19. 15:49

Hello, World!

우리가 지난 포스팅 1) 자바의 설치에서 마지막에 만들어 낸 것을

클래스(Class)라고 한다.

자바에서 모든 코드는 반드시 클래스 내에 있어야하고 이 클래스들이 모여

하나의 자바 어플리케이션을 구성하게 된다.

 

이 클래스 안에는 메소드(Method)라는 것이 있는데 메소드는 클래스의 기능을 담당한다.

메소드를 호출하면 해당 메소드의 { } 안에 있는 내용을 실행하게 된다.

 

이게 무슨말인지 실행 메소드와 출력 메소드를 이용해 간단한 코드를 작성해보겠다.

 

public static void main(String[] args) {} 이 메소드는 실행 메소드(메인 메소드)라고 한다.

단어 그대로 우리가 작성한 코드들을 실행해 주는 역할이다.

다음으로 System.out.print(); 출력 메소드이다.

괄호 안에 값들을 모니터로 출력해주는 역할을 한다.

 

코드를 작성했다면 이제 실행을 해보자.

우선 저장을 해야하는데 보통 단축키를 사용한다. Ctrl + s를 눌러주면 저장이 된다.

언제 데이터가 날아갈지 모르므로 항상 저장을 하는 습관을 들여야한다.

저장이 완료 되었으면 위 사진에서 커서가 올라가있는 Run ~ 버튼이나 단축키 Ctrl + F11을 눌러준다.

 

그러면 이렇게 Console창에 작성한 값이 잘 출력되는 것을 볼 수 있다.

 

 

변수

이제 본격적으로 자바를 파헤쳐 보려한다.

그 첫번째는 바로 변수이다.

변수란 메모리에 값을 저장하기 위한 공간을 의미한다.

쉽게 말하면 무언갈 담기위한 상자라고 생각하면 된다.

 

변수를 사용하면 가독성이 좋아지고 굳이 여러번 입력하지 않아도 되기때문에

유지보수가 쉽고 코드량이 줄게 된다.

 

변수를 사용하기 위해서 우리는 먼저 선언이라는 것을 해야한다.

내가 메모리에 데이터를 저장할 수 있는 공간을 할당하겠다

즉, 내가 상자를 만들겠다라고 말하는 것이다.

 

선언은 ' 자료형 변수명; ' 과 같이 하는데

자료형은 내가 상자의 넣을 물건이 어떤 타입의 물건인지, 상자의 크기는 어느정도여야 하는지

변수명은 그 상자의 이름을 무엇이라 지어줄 것인지

;은 마침이라는 의미를 가지고 있다.

 

초록 글씨는 주석으로 코드에 포함이 안된다. 단축키 Ctrl + / 를 사용하거나 직접 //를 입력해도 된다.

위 코드에서 boolean, char, String, byte, short, int, long, float, double이 자료형이다.

여기서 String을 제외한 8가지 자료형은 기본 자료형이라하고 String 등 그 외 모든 자료형은 전부 참조 자료형이라 한다.

 

컴퓨터가 데이터를 저장할 땐 저장 공간이 한정되어 있으므로 일정한 저장 크기에 대한 기준을 정해야하는데

그 최소 단위로 bit를 가지고 있다.

bit는 데이터의 최소 저장 단위로 2진수 값 하나를 저장할 수 있는 공간을 의미하고

byte는 데이터 처리 혹은 문자의 최소 단위로 8개가 모여서 한개의 byte가 만들어진다.

 

기본 자료형의 범위

우리가 변수를 선언할때 아무런 값을 집어넣지 않더라도 무언가는 들어가있어야 하는데

이러할 때 자동적으로 기본값이 들어가게 된다.

 

long, float의 경우 값을 입력할때 끝에 L, f로 표기를 해줘야한다.

 

char의 경우 단 한글자의 유니코드 문자를 표현한다.

 

또한, 변수를 명명할때도 규칙이 있는데 관례적으로 이전 포스팅에서 이야기한

Camel case를 적용한다.

변수명을 userage로 하고 싶다면 userAge로 작성해서 사용하면 된다.

특수문자는 '_', '$'가 사용가능하지만 _는 관례적으로 사용하지 않고

$는 내부 클래스에서만 사용한다.

그리고 숫자로 시작해선 안되며 길이의 제한은 없다.

 

우리가 값을 집어넣을때 boolean bool = true; 이런식으로 '='을 사용하는데

수학에선 각 항의 값이 같다 라는 의미겠지만 프로그래밍에선

같다 라는 의미가 아니라 '오른쪽의 값을 왼쪽에 집어넣겠다'라는 의미가 된다.

변수에는 단 한개의 데이터만 보관할 수 있으며, 가장 마지막에 대입한 값만 보관하게 된다.

이 때, 변수에 대입되는 값을 프로그래밍에선 '리터럴'이라 하기도 한다.

 

변수를 사용할때 가장 처음으로 값을 저장해주는 것을 초기화라 하고

위 사진처럼 선언을 하고나서 초기화를 할 수도 있고

선언하면서 동시에 초기화를 할 수도 있다.

메소드 안에 있는 변수는 반드시 초기화를 해주어야 한다.

 

초기화를 할 때 char는 문자라는 의미로 ' '를 사용하고

String은 문자열이라는 의미로 " "를 사용한다

 

final 이라는 예약어를 사용하면 단 한 번만 저장할 수 있게 된다.

이를 프로그래밍에선 상수라고 한다.

상기한 내용처럼 선언 후 초기화, 선언하면서 초기화 둘 다 가능하며

이 이후에는 다른 값을 저장할 수 없다.

위 사진에선 height1이 180.8이라는 값으로 초기화되었고

190.8이라는 값으로 변경하려하니 빨간줄이 뜨며 에러가 발생하였다.

 

상수를 명명할 때는 전부 대문자로 표현하는게 관례이고, 공백이 있는경우 _로 표현한다.

예를 들면 max age는 MAX_AGE라 작성한다.

 

이제 기본 자료형이 아닌 참조 자료형 String을 알아보자.

String은 문자열을 저장하는 자료형인데 여기서 문자열이란

""로 묶여있는 값을 말한다.

그 뿐만 아니라 다른 자료형 뒤에 문자열이 오거나 문자열 뒤에 다른 자료형이 와도

문자열로 인식을 하게된다.

 

형변환

우리가 변수를 사용하면서 분명 값의 자료형을 바꾸고자 할 때가 올 것이다.

컴퓨터는 같은 종류의 자료형만 대입 및 계산이 가능하고 그 결과 마저도 같은 값이 나와야하기 때문이다.

 

위 내용에 따르면 iNum + dNum 값을 나타낼 수 없을 것이다.

하지만 다행스럽게도 값의 자료형을 바꾸는 두 가지의 방법이 있다.

 

첫 번째는 자동 형변환이다.

컴파일러가 자동으로 자료형의 크기(byte)가 작은 자료형을 큰 자료형으로 변환한다.

 

byte는 1byte 크기의 값을 저장하므로 2byte 크기를 저장하는 short와 대입, 계산을 할 때

자동으로 형변환이 되고 나머지도 마찬가지이다.

예외적으로 boolean은 true와 false만 갖기때문에 제외되고 long은 8byte, float은 4byte이지만

long은 정수형, float은 실수형이기 때문에 표현할 수 있는값이 더 많아서

float에서 long이 아닌 long에서 float으로 자동 형변환이 된다.

 

이것이 가능한 이유는 값의 범위가 작은 자료형에서 큰 자료형으로 바꿀땐 데이터 손실이 없기 때문이다.

그렇다면 반대의 경우는 불가능할까?

어느정도의 데이터 손실을 감수한다면 강제적으로 바꾸는 것이 가능하다.

이것을 강제 형변환이라고 한다.

강제 형변환을 사용하기 위해선 변수명 앞에 (자료형)을 작성하면 된다.

 

char같은 경우 int 등으로 형변환을 하면 기존 값과 다른 숫자가 나올텐데

아스키 코드로 확인이 가능하다.

 

 

아스키 코드표(ASCII Table)

아스키 코드표다. 컴퓨터는 문자를 문자로 기억하지 않는다. 그대신 순자로 기억하고 표현한다. 예를 들면 문자 'A'는 65로, 'B'는 66으로 표현한다. 그런데 사람마다 규칙을 개인대로 정하면 자칫

stepbystep1.tistory.com

 

double 자료형을 갖는 값을 int 자료형으로 강제 형변환하였다.

위 사진을 보면 3.141592라는 값을 가지는 double자료형을 int로 강제 형변환하니

소수점 아래 데이터가 유실되었다.

 

그리고 사진을 자세히 살펴보면 System.out.println(), System.out.print()라는

두 가지 출력메소드가 사용되었는데 약간의 차이를 가지고있다.

전자의 경우 줄바꿈을 해준다는 차이가 있다.

위 코드에서 println 메소드를 사용하지 않았더라면

콘솔에는 3.1415923 이라는 값이 출력되었을 것이다.

 

출력 메소드에 관한 얘기가 나온김에 추가적으로 한 가지 더 말하자면

System.out.printf()라는 출력 메소드도 있다.

정해져 있는 형식에 맞춰서 변수를 줄바꿈 하지 않고 출력하는 메소드이다.

 

dNum을 소수점 두자리까지 표현했다.

사용방법은 System.out.printf("출력하고자 하는 내용 + 변수 형식", 변수명1, 변수명2, ...)이고

변수 형식은 아래와 같다.

 

가장 아래의 경우 숫자를 바꿔 원하는 만큼 확보 혹은 표시가 가능하다.