과학

자바로 프로그래밍에 입문할래요: 1.2. 내장 자료형 (1)

0.0. 여는글, 1.1. 첫 프로그램 만들기

 

내장 자료형(Built-in Type)

  자바 프로그래밍에서 여러분은 프로그램이 처리하는 자료의 형태에 대해 꼭알아야 합니다. 1.1절의 프로그램은 문자열을 처리했었습니다. 이번 절에서는 숫자에 대해 처리해볼 것이며, 이후의 절에서는 다양한 숫자 자료형에 대해 알아볼 것입니다.

 

  이 자료형들 사이의 차이를 이해하는 것은 굉장히 중요하기 때문에, 우리는 이를 다음과 같이 정의 합니다: 자료형은 값의 집합과 그 값에 정의된 연산의 집합이다.

 

  여러분은 정수나 실수와 같이 다양한 숫자의 자료형과 그것에 정의된 연산에 대해 친숙할 것입니다. 예를 들면 덧셈이나, 곱셈처럼 말이죠. 

 

  수학에서 수의 집합은 무한합니다. 하지만 컴퓨터 프로그램에서 우리는 어쩔 수 없이 유한한 숫자로 작업을 해야 합니다. 컴퓨터의 부품 공간은 무한하지 않으니까요! 마찬가지로 우리가 사용할 각각의 연산들 또한 이런 유한한 집합에서만 잘 정의가 되어 있습니다.

 

  자바에는 여덟 개의 기본 자료형(primitive type)이 존재합니다. 대부분의 기본 자료형은 숫자와 관련된 것입니다. 예를 들면 정수는 int, 실수는 double, 그리고 참/거짓의 값만을 가지는 boolean(불리언)이 있습니다.

 

  그 외에도 자바에는 다양한 자료형들이 존재합니다. 가령, 1.1절에서는 여러분들도 모르게 String이라는 문자열 자료형을 사용했습니다. 사실 String은 기본 자료형이 아니지만, 그럼에도 불구하고 자바는 String을 기본 자료형처럼 다룹니다. 이는 String이 입출력을 위해 필수적이기 때문에 특별하게 관리하는 것입니다.

 

  명확하기 위해, 앞으로 우리는 기본 자료형과 String 자료형을 통틀어서 내장 자료형이라고 통칭하겠습니다.

 

  당분간 우리는 내장 자료형들을 다루는 프로그램에 집중할 것입니다. 나아가, 여러분은 자바 라이브러리 자료형에 대해 배우고, 나만의 자료형을 만들 수 있게 될 것입니다. 실제로도 자바 프로그래밍은 자주 자료형을 구축하는데, 이는 챕터 3에서 확인할 수 있습니다.

 

  자료형(값과 연산)에 대해 이해하는 것은 프로그래밍의 시작에 필수적입니다. 다음 절에서 나오는 좀 더 복잡한 프로젝트로 작업하기 위한 단계입니다. 여러분이 작성할 모든 프로그램은 이번 절에서 제시하는 작은 코드 조각들로 구성될 것입니다.

 

 

 

 

 

 

정의

  자료형에 대해 이야기하려면, 용어에 대한 소개가 필요하겠죠? 다음 코드 조각들로 시작해봅시다.

 

 
int a, b, c;
a = 1234;
b = 99;
c = a + b;

 

  첫째 줄은 '선언'(declaration)입니다. 이름을 식별자 a, b, c로 하고, 자료형이 int형인 '변수'를 선언해준 모습입니다. 이후의 세 줄은 '대입'(assignment)입니다. 변수의 값을 바꾸기 위한 것이며, 말 그대로 a에는 1234, b에는 99, c에는 a+b의 값을 대입합니다. 결론적으로 c에는 1333의 값이 대입됩니다.

 

 

식별자(Identifiers)

  자바에서는 식별자를 이용해 변수(혹은 그 외의 다양한 것들)의 이름을 지정합니다. 식별자는 문자, 숫자, _, $로 구성될 수 있으며, 숫자로 시작할 수 없습니다. 예를 들어 abc, Ab$, abc123, a_b는 모두 적합한 자바의 식별자입니다. 식별자는 대소문자를 구별합니다. 따라서 Ab, ab, AB는 모두 다른 이름입니다. Ab*, 1abc, a+b는 적합하지 않은 식별자의 예입니다. 또한 public, static, int, double 등의 예약어를 변수 이름으로 사용할 수 없습니다.

 

 

리터럴(Literals)

  리터럴은 자료형의 값을 대표하는 소스 코드입니다. 우리는 1234, 99와 같이 숫자들을 이용해서 정수 리터럴을 정의합니다. 소수점을 추가하면, 실수 리터럴의 값을 정의하게 되는 것입니다. boolean 값을 정의하기 위해서는 true나 false 키워드를 이용하고, 문자열을 정의하기 위해서는 "Hello, World"와 같이 큰따옴표를 이용합니다. 아직은 감이 잘 안 오실 수도 있겠지만, 앞으로 각각의 자료형에 대한 자연스레 리터럴들을 배워갈 것입니다.

 

 

변수(Variables)

  변수는 자료형의 값을 참조하기 위해 사용하는 이름입니다. 우리가 프로그램을 구성하며, 어떤 계산을 해낼 때 해당하는 값들을 추적하기 위해 변수를 사용합니다. 예를 들어, 많은 프로그램에서는 무언가를 세기 위해 n이라는 이름의 변수를 사용합니다. 우리는 선언에서 자료형과 이름을 명시함으로써 변수를 만들 수 있습니다. 또한 변수의 이름과 그 자료형에 정의된 연산을 이용해 계산을 할 수 있습니다. 각 변수는 언제나 그 자료형이 허용 되는 값에 한해서 저장되어 있습니다.

 

 

선언문(Declaration statements)

  선언문은 변수의 이름과 자료형을 컴파일 시기 때 연관짓는 것입니다. 자바에서는 변수의 이름과 자료형을 명시해야만 선언할 수 있습니다. 

 

  자바를 강타입 언어라고 말하는데, 자바 컴파일러는 컴파일 시기에 소스코드의 유효성을 확인할 수 있기 때문입니다. 예를 들어, double에 String을 더하는 것은 허용되지 않고, 자바 컴파일러는 이를 컴파일 시기 때 오류로 잡아냅니다. 이는 과학에서 단위를 이용해 양을 맞추는 것과 동일합니다. 예를 들어, 인치로 측정된 양과 파운드로 측정된 양을 더하는 것은 이치에 맞지 않죠.

 

  선언은 변수가 사용되기 전이라면 어디에든 위치할 수 있습니다. 보통은 처음 사용하는 부분에 선언하는 편입니다.

 

 

대입문(Assignment statements)

  대입문은 자료형의 값과 변수를 연관짓는 것입니다. c = a + b 라고 자바에서 쓸 때, 우리는 이를 수학의 등식이라고 생각하지 않습니다. 이는 c의 값을, a의 값과 b의 값을 더한 값으로 대입하는 행위입니다. 물론 결론적으로 c = a + b의 등식이 성립합니다만, 여기서 요지는 대입문 이후로 c의 값이 변했다는 사실입니다.

 

  좌변은 반드시 하나의 변수만 있어야 하며, 우변은 그 자료형의 값을 생성하는 임의의 수식들이 있을 수 있습니다. 예를 들어 우리는 자바에서 discriminant = b*b - 4*a*c 라고 쓸 수 있죠. a + b = b + a 혹은 1 = a 라고는 쓸 수는 없습니다. 따라서 등호의 의미는 수학의 등호와는 분명히 다르다는 점을 기억하세요. 또 다른 예로, a = b와 b = a는 다릅니다. 또한 c = a + b에서, c의 값이 a의 값과 b의 값을 더한 것과 같다는 사실은, c = a + b가 실행된 뒤 차후의 다른 대입문에 의해 어느 변수든 변화한다면 수학적으로 그 의미를 잃게 됩니다.

 

  

초기화(Initialization)

  단순 선언에서, 변수의 초기값은 정의되어 있지 않습니다. 예를 들어, int a; 라고 선언했을 때 우리는 a의 값이 무엇인지 알 수 없습니다. 하지만 효율적인 코딩을 위해, 우리는 선언문과 대입문을 합쳐 변수의 초기값을 지정할 수 있습니다. int a = 1234; 처럼 말이죠.

 

 

변수의 값을 추적하기

  마지막으로 여러분들의 이해를 확인하기 위해, 다음 코드를 통해 a와 b의 값이 서로 교환된다는 사실을 스스로 확인해보세요.

 

 
int a = 1234;
int b = 99;

int t = a;
a = b;
b = t;

 

  이를 확인하기 위해서, 유서 깊은 프로그램의 검진법을 소개합니다. 각 문장 이후에 표의 변수 값이 어떻게 되는지 공부해보세요. 이를 추적 테이블(trace)이라고 합니다.

 

 

 

 

표현식(Expressions)

  표현식은 리터럴이나 변수, 혹은 일련의 연산들과 함께 값 하나를 특정하는 것입니다. 기본 자료형의 경우 표현식은 수학 공식과 유사합니다. 사용하는 연산자의 대부분은 x+1 또는 y/2 와 같이 연산자 양 옆에 두 개의 피연산자가 필요한 '이진 연산자'입니다. 또한 각 피연산자는 임의의 식일 수 있습니다.

 

 

 

우선순위(Precedence)

  표현식은 단순히 좌측부터 우측으로 계산되지 않습니다. 자바에선 연산자들의 우선순위가 잘 정의되어 있으며, 보통 수학의 연산자 우선순위와 유사합니다. 우리는 괄호를 이용해서 먼저 계산할 것들을 미리 지정할 수 있기 때문에, 사실 크게 신경 쓸 일은 없습니다.

 

 

String으로 받아온 인자를 숫자로 바꾸기

  우리가 이전에 UseArgument 프로그램에서 args[0]을 이용해 사용했던 명령행(Command-line) 인자는 String 문자열로 받게 됩니다. 이는 숫자를 입력해도 마찬가지입니다. 1234를 입력한다면, 문자열인 "1234"로 인식하게 되죠. 이 때 여러분은 "1234"를 수학적으로 연산할 수 없습니다. 인치로 측정된 양을 파운드로 측정된 양과 더할 순 없으니까요!

 

  다행히 자바는 자바 라이브러리 메소드라고 해서, Integer.parseInt() 와 Double.parseDouble() 메소드를 지원합니다. 예를 들어, Integer.parseInt("123")은 정수 리터럴 123으로 변환 됩니다. Integer.parseInt(args[0]) 역시 똑같이 명령행에서 입력된 인자를 정수형으로 변환해줍니다.

 

 

출력을 위해 기본 자료형을 문자열로 바꾸기

  여러분이 숫자를 문자열로 쉽게 바꿀 수 있는 하나의 특별한 규칙이 있습니다: 자바에서는 + 연산자를 이용할 때 양쪽의 두 피연산자 중 하나가 String이면, 나머지 하나도 자동으로 String으로 바꾸어 줍니다. 다음 코드 조각을 참고하세요.

 

 
String a1 = "1234";
String b1 = "99";
String c1 = a1 + b1;

String a2 = "1234";
int b2 = 99;
String c2 = a2 + b2;

 

  이 때 c1과 c2는 같습니다. 값은 "123499"겠네요. 또한 System.out.print() 와 System.out.println() 을 사용할 때도 자동으로 변환해줍니다. 다음처럼 활용할 수도 있겠네요.

 

System.out.println(a + " + " + b + " = " + c);

 

 m 우리가 자바 프로그램을, 문자열 인수를 받아 문자열 결과를 출력하는 블랙박스라고 보는 관점은 여전하지만, 이제부터는 이런 메커니즘들을 통해서 문자열을 숫자로 받고, 더 의미있는 계산의 인자로 활용할 수 있게 되었습니다.

 

 

문자와 문자열

  char형은 character에서 따온 자료형의 이름입니다. char 자료형에는 65536개의 서로 다른 문자를 담을 수 있습니다. char의 리터럴은 작은따옴표를 둘러싸서 표현합니다. 예를 들어, 'a' 는 문자 a를 표현하는 char의 리터럴입니다. 탭이나 개행, 백슬래시, 작은따옴표와 큰따옴표는 각각 '\t', '\n', '\', '\'', '\"'로 표현합니다.

 

  String은 문자열, 즉 문자들의 집합입니다. String의 리터럴은 큰따옴표를 둘러싸서 표현합니다. 예를 들어 "Hello, World" 처럼요. String 자료형은 기본 자료형이 아니지만, 자바는 마치 기본 자료형처럼 다룹니다. 우리가 + 연산자를 쉽게 사용할 수 있는 것도 이런 이유에서 그렇습니다. 이 때 + 를 우리는 연결 연산자(concatenation operator)라고 말합니다.

 

  연결 연산자는 굉장히 강력해서, 작업을 효율적으로 만듭니다. <프로그램 1.2.1, Ruler>는 '자 함수' 값의 표를 만드는데, 자 함수란 자에서 표시되어 있는 눈금의 길이를 말하는 함수입니다. 말로는 어려우니, 직접 보는 게 좋겠네요.

 

프로그램 1.2.1: Ruler

 
public class Ruler
{
	public static void main(String[] args)
	{
		String ruler1 = "1";
		String ruler2 = ruler1 + " 2 " + ruler1;
		String ruler3 = ruler2 + " 3 " + ruler2;
		String ruler4 = ruler3 + " 4 " + ruler3;
		System.out.println(ruler1);
		System.out.println(ruler2);
		System.out.println(ruler3);
		System.out.println(ruler4);
	}
}
% javac Ruler.java
% java Ruler
1
1 2 1
1 2 1 3 1 2 1
1 2 1 3 1 2 1 4 1 2 1 3 1 2 1

 

 

 

 

  여기서 주목할 점은, 꽤 많은 양의 출력을 내고 있음에도 여전히 코드는 짧다는 것입니다. 이 프로그램을 확장하기 위해, 5번째, 6번째, 7번째 줄을 계속 출력하게 하고 싶다면, 단순히 매번 두 문장을 추가하기만 하면 됩니다. 출력의 크기는 정확히 두 배로 증가하죠. 따라서 연결 연산자는 출력을 위한 계산 결과를 시스템으로 통합할 때 자주 사용됩니다.

 

  따라서 우리가 이전에 작성해봤던 <프로그램 1.1.2, UseArgument>도 다음과 같이 통합해볼 수 있겠죠?

 

 
System.out.print("Hi, ");
System.out.print(args[0]);
System.out.println(". How are you?");
System.out.println("Hi, " + args[0] + ". How are you?");

 

(계속)

 
 

14개의 댓글

2021.03.20

대입도 맞긴 한데 난 저장이라는 표현이 좀 더 정확하다고 생각이 들더라

초보자에게는 대입이라는 표현도 어렵다고 생각이 들더라고 ㅇㅇ

 

실제로 선언이 메모리(램) 공간을 확보하는 것이기 때문에

저장이라는 표현이 전혀 잘못된게 아니라 오히려 정확하다고 생각하거든

0
2021.03.20
@숨은음은

문제는 그렇다고해서 저장문이라고 용어를 알려줄 순 없다는 거지. 그 의미가 어떻든간에, 학계에서 통용되는 용어를 사용하는 건 중요하다고 생각해.

 

저장이라는 단어가 더 와닿을 수 있다는 말에는 동의함.

0
2021.03.20
@스비니

ㅇㅇ 대입문이라고 하는게 맞는데...

 

대입문이라고 해서 아래 같은 코드에 4라고 대답하는 사람이 생기는듯.

 

A = 1;

B = A + 1;

A = 3;

System.out.println(B);

0
2021.03.20

입문이면 이런거 읽을시간에 코드 한줄 더 쓰고 디버깅하는게 100배 나음

0
2021.03.20
@고부추랄

너가 옳아.

0
2021.03.20
@스비니

넌 틀림

0
2021.03.20

자바ㅜ어렵던데 html로 프로그래밍 하면 안되나여?

0
@펭귄성애자

.. 할수있으면 어떤의미로든 대박이겠네

0
2021.03.20

자바로 개발시작한지 2년쯤 된거같은데

자바 넘 조아 재밌엉

0
2021.03.21

개발자 2년차인데 좋은글 개추

0
2021.03.21

개념 되게 탄탄하고 알차네. 입문자는 아니지만 연재하면 계속 봐야겠다 고마워~

0
mas
2021.03.21

객체지향 개념 잡는게 문제지..

0
2021.03.21
@mas

사람들이 객체지향의 개념을 잘 이해하지 못하는 걸 난 2가지 이유라고 보는데,

1. 다들 c로 프로그래밍을 시작하기 때문이고

2. 다들 입문 때 객체지향의 중요성을 느낄 정도로 규모의 프로그래밍을 하지 않거나, 복잡한 프로그래밍을 하지 않기 때문이야.

 

사실 두 번째 이유가 굉장히 크다고 보는데, 지금 내가 번역하고 있는 이 책은 예제들을 굉장히 많이 보여줘서, 또 객체지향의 정석인 자바로 시작하기 때문에 후반부에 접어들면 자연스럽게 객체지향이 스며들 거라고 봐.

1
@스비니

2번째 이유가 정말 크지

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜
493 [과학] 자바로 프로그래밍에 입문할래요: 1.5. 입출력 (1) 1 스비니 1 4 일 전
492 [과학] 자바로 프로그래밍에 입문할래요: 1.4. 배열 (3) 1 스비니 4 13 일 전
491 [과학] 일론 머스크는 스티브 잡스 같은 사람이다. (feat. 뉴럴링크) 38 빨머 20 14 일 전
490 [과학] 자바로 프로그래밍에 입문할래요: 1.4. 배열 (2) 9 스비니 2 20 일 전
489 [과학] 방사선에 관하여_20210423_Ch.4까지 완료 63 ptrtype01 4 21 일 전
488 [과학] 日 자민당 의원이 공개한 원전오염수 성분 31 SOLEUS 16 23 일 전
487 [과학] ??? : 한국이 오염수 더 많이 방류한다 빼애액 24 SOLEUS 13 23 일 전
486 [과학] 일본의 방사능 기준치가 신용받지 못하는 이유 71 뭘까요 1 24 일 전
485 [과학] 도쿄의 암 발생률. 27 뭘까요 5 24 일 전
484 [과학] 일본은 과연 후쿠시마 인근만 방사능에 오염돼었을까? 13 뭘까요 10 24 일 전
483 [과학] 일본이 주장하는 후쿠시마의 방사능량은 서울과 같다는게 사... 31 뭘까요 14 24 일 전
482 [과학] 일본 후쿠시마 오염수 방류 팩트정리 21 뭘까요 7 24 일 전
481 [과학] 자바로 프로그래밍에 입문할래요: 1.4. 배열 (1) 13 스비니 7 28 일 전
480 [과학] 약사가 쓴 az백신과 혈전에 관한 글 109 pipo 40 2021.04.08
479 [과학] 자바로 프로그래밍에 입문할래요: 1.3. 조건문과 반복문 (2) 21 스비니 4 2021.04.06
478 [과학] 사회과학계에서 밝혀졌던 "보이루"의 실체 13 안티파굳 23 2021.04.05
477 [과학] 피임약은 어떻게 임신을 예방할까? 33 동식 18 2021.04.01
476 [과학] 자바로 프로그래밍에 입문할래요: 1.3. 조건문과 반복문 (1) 11 스비니 2 2021.03.27
475 [과학] 급성 방사선 장해의 치료 역사, 그리고 방법은 무엇일까? 20 바른말고운말하는사람 7 2021.03.24
474 [과학] 자바로 프로그래밍에 입문할래요: 1.2. 내장 자료형 (2) 23 스비니 5 2021.03.23