{자바-기초} 문법 노트 (4) 원시 타입

이번 시간에는 Java에서 사용되는 원시 타입에 대해 살펴보도록 하겠다. Java는 아래와 같은 총 8개의 원시 타입을 제공한다.

원시 타입 (primitive type)
부울과 문자
boolean - true 혹은 false를 값으로 가짐
char - 유니코드 한 글자를 저장 (16bit)

숫자
정수
byte - 8bit 크기  -128~127
short - 16bit 크기 -32768~32767
int - 32bit 크기 -232 ~ (232 - 1)
long - 64bit 크기

부동소수점 (실수)
float - 32bit
double - 64bit

변수는 앞서 설명한 것처럼 값을 담아두기 위한 그릇이다. 그 그릇에 담는 값을 Java에서는 리터럴 혹은 상수라고 한다. 여기서는 Java Tutorial의 표기에 따라 리터럴(literal)이라고 부르겠다. 각 타입에 따른 리터럴 표현 방법과 변수의 선언 방법은 다음과 같다.

package exam.fundamental;

public class Variables {
public static void main(String[] args) {
boolean b; // 논리(boolean) 타입의 변수 선언
char c; // 문자 타입의 변수 선언
byte bt; // Byte 타입의 변수 선언
short sd; // Short 타입의 변수 선언
int i; // 정수 타입의 변수 선언
long ld; // Long 타입의 변수 선언
float f; // 실수 타입의 변수 선언
double d; // Double 타입의 변수 선언

b = true; // 논리 타입의 리터럴 할당

c = 'A'; // 문자 타입의 리터럴 할당
c = 65; // 정수형 타입의 리터럴 할당. 아스키 코드값으로 저장되어 문자로 표현
c = '\u0041'; // Unicode escape 표현식 16진수로 표시
System.out.println("c : " + c);

bt = 127; // byte 타입의 리터럴 할당
sd = -32768; // short 타입의 리터럴 할당
i = 2147483647; // int 타입의 리터럴 할당
i = 0xFF; // 16진수 리터럴 할당 '0x'로 시작
i = 0376; // 8진수 리터럴 할당 '0'으로 시작
ld = -9223372036854775808L; // long 타입의 리터럴 할당. 'L', 'l'을 붙임.
f = 3.1415F; // float 타입의 리터럴 할당. 'F', 'f'를 붙임.
d = 3.1415; // double 타입의 리터럴 할당. 디폴트 타입.
}
}



디폴트 값
클래스의 필드로 선언된 변수의 경우 인스턴스가 될 때 자동으로 초기값이 부여된다.

Data Type Default Value (for fields)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object)   null
boolean false

public class DefaultValues {
boolean b; // 논리(boolean) 타입의 변수 선언
char c; // 문자 타입의 변수 선언
byte bt; // Byte 타입의 변수 선언
short sd; // Short 타입의 변수 선언
int i; // 정수 타입의 변수 선언
long ld; // Long 타입의 변수 선언
float f; // 실수 타입의 변수 선언
double d; // Double 타입의 변수 선언

public static void main(String[] args) {
DefaultValues dv = new DefaultValues();
System.out.println("boolean : " + dv.b);
System.out.println("char : " + dv.c);
System.out.println("byte : " + dv.bt);
System.out.println("short : " + dv.sd);
System.out.println("int : " + dv.i);
System.out.println("long : " + dv.ld);
System.out.println("float : " + dv.f);
System.out.println("double : " + dv.d);
System.out.println("String : " + new String());
}
}


변수에 값을 넣을 경우 자동확장(promotion)이 되어 작은 유형의 값을 큰 유형의 변수에 넣을 수 있다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/08/18 16:50 2008/08/18 16:50
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/15

Java라는 프로그래밍 언어 대해 공부를 해오면서 이런 저런 책들과 이런 저런 사이트들을 보았지만 이거다 싶은 책이나 사이트가 딱히 눈에 띄지 않았다. 거의 대부분이 천편일률적으로 데이터 타입, 조건문, 반복문, 연산자, 클래스, 상속 등을 소개한 후 util 패키지, 그리고 Swing이나 입출력 관련 패키지, 네트워크 관련 패키지를 소개하는 것으로 마무리가 되었다.
책이란게 본디 자습(自習)을 위해 쓰여졌건만 사실 책만으로 프로그래밍 언어를 익힌다는게 그리 쉽지는 않은게 사실이다.
특히 Java는 객체지향 언어라고 하는 독특한 특징을 가지고 있건만, 클래스와 상속, 인터페이스를 아무리 문법적으로 익혀본들 객체지향이라는 특징을 어떻게 살려야하는지 내가 짜고 있는 프로그래밍 과연 객체지향적으로 작성이 되었는지 알수가 없었다.
그러던 중 'Head First Design Patterns'라는 책을 읽으면서 객체지향적인 프로그래밍이 무엇인가를 조금 느껴볼 수 있었고 Java 문법 구조를 바라보는 눈도 이전과는 조금 달라졌다.
그래서 객체지향언어로써의 Java를 다시금 익히는 마음으로 문법 노트를 작성해 보려고 한다. 아울러 이 글을 쓰며 참고한 자료도 지속적으로 소개할까 한다.

*** 참고 자료 ***
8. JavaTM Platform, Standard Edition 6 API 스펙 (http://xrath.com/javase/ko/6/docs/ko/api/index.html)

7. Java SE Development Kit 6 (JDKTM 6) documentation

6. The JavaTM Tutorials (http://java.sun.com/docs/books/tutorial/index.html)

5.
초보자를 위한 UML 객체지향 설계 - 10점
조셉 슈멀러 지음, 곽용재 외 옮김/정보문화사

4.
다이어그램으로 쉽게 배우는 UML - 10점
이노우에 타케시 지음, 이영희 옮김/한빛미디어

3.
Thinking in JAVA - 10점
Bruce Eckel 지음, 심재철.최정국 옮김/사이텍미디어(희중당)

2.
Head First Java - 10점
케이시 시에라 외 지음, 서환수 옮김/한빛미디어

1,
Head First Design Patterns - 10점
에릭 프리먼 외 지음, 서환수 옮김/한빛미디어
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/08/18 15:36 2008/08/18 15:36
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/16

이번 시간에는 변수에 대해서 알아보겠다. 변수란 리터럴(값)을 담는 일종의 그릇이다.

사용자 삽입 이미지
 Java는 다양한 타입의 리터럴을 사용할 수 있으며 엄격한(strict) 타입의 언어이기 때문에 리터럴을 담을 그릇인 변수의 타입도 리터럴과 일치해야만 올바로 담을 수 있다.
변수에 리터럴을 담는 것을 '할당' 혹은 '대입'이라고 하며, '=' 연산자가 이 기능을 한다. 그래서 '=' 연산자를 '할당연산자' 혹은 '대입연산자'라고 한다.
int i = 79;

위의 코드는 정수 타입의 변수 'i'를 선언하여 '79'라는 정수 리터럴을 할당하고 있다.
변수에는 원시 변수(primitve varlable)와 객체 참조(object reference)가 있다. 원시 변수란 Java에서 제공하는 원시 타입의 리터럴을 할당할 수 있는 변수를 말하며 객체 참조는 지난 강의에 보았듯이 인스턴스(객체)를 지정하기 위해 사용하는 변수이다.
클릭하면 원래 크기로 보입니다.

원시 변수와 객체 참조

public class DiffVariable {

public static void main(String[] args) {
int i = 75; // 원시 변수
Dog d = new Dog(); // 객체 참조

System.out.println("원시 변수 'i'의 리터럴 : " + i);
System.out.println("객체 참조 'd'의 리터럴 : " + d);
}

}


위의 코드를 실행하면 다음과 같은 결과가 출력된다.
원시 변수 'i'의 리터럴 : 75
객체 참조 'd'의 리터럴 : Dog@1fb8ee3

원시 변수 'i'는 75라는 정수 값을 할당했기 때문에 당연히 75가 출력된다. 하지만 객체 참조인 'd'는 출력 모양이 별스럽다. Java는 인스턴스를 만들면 해당 인스턴스를 메모리의 특정 위치에 저장하는데 이때 저장된 주소가 바로 16진수 숫자값으로 표시되는 주소이고 이 값은 그때 그때 달라진다. 그리고 Dog는 클래스 이름이라는 것은 눈치챘을 것이다. 이렇게 출력된 값은 아무 의미가 없기 때문에 보통 toString()이라는 메서드를 추가하여 인스턴스의 값을 출력하게 한다.
/**
* 클래스명 : Dog
* @author 정승용 (jeongsy10@empal.com)
* @version 1.01
*/
class Dog {
String kind; // 품종
int age; // 나이
String name; // 이름
String size; // 크기
String color; // 털 색깔

void seat() { System.out.println("앉는다."); } // 앉다
void standUp() { System.out.println("일어선다."); } // 일어서다
void run() { System.out.println("달린다."); } // 달린다
void stop() { System.out.println("멈춘다."); } // 멈춘다
void bark() { System.out.println("짖는다."); } // 짖는다
// toString() 메서들를 이용하여 개이름을 출력하도록 함
public String toString() {
return name;
}
}
toString()에 대해서는 '상속'이라는 개념을 설명할 때 다시 설명하도록 하겠다. 여기서는 toString() 메서드의 역할만 살펴보도록 하자. toString()은 인스턴스의 리터럴을 출력할 수 있도록 해준다. 실행 코드를 조금 변경하여 다시 실행해보자.
public class DiffVariable {

public static void main(String[] args) {
int i = 75; // 원시 변수
Dog d = new Dog(); // 객체 참조
d.name = "바둑이"; // 인스턴스의 필드 'name'에 "바둑이" 할당
System.out.println("원시 변수 'i'의 리터럴 : " + i);
System.out.println("객체 참조 'd'의 리터럴 : " + d);
}
}

인스턴스의 필드인 'd'에 "바둑이"를 추가했다. 이렇게 실행 시키면 결과는 다음과 같다.
원시 변수 'i'의 리터럴 : 75
객체 참조 'd'의 리터럴 : 바둑이
toString() 메서드의 역할을 알겠는가? toString()메서드를 활용하여 객체 참조가 갖고 있는 의미없는 리터럴 대신 인스턴스 안의 의미있는 필드 값을 출력할 수 있다.
이번 강의에서는 원시 변수와 객체 참조의 차이점을 살펴보았다. 다음 강의에서는 원시 변수의 타입에 대해서 살펴보겠다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/08/12 15:56 2008/08/12 15:56
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/14

지난 시간에 만들었던 Dog 클래스를 완성시켜 보겠다. 일단 각 메서드(동작)들은 해당 동작을 출력하도록 간단히 작성을 하겠다. 일단 Java에서 사용할 수 있는 출력문을 살펴보겠다.

System.out.println("출력내용");

위의 명령은 ""안의 내용을 명령프롬프트 화면에 출력시키는 기능을 한다. 그러면 Dog 클래스의 완성된 모습과 함께 이 클래스를 이용하여 만든 인스턴스(객체)를 사용해보자.
/**
* 클래스명 : Dog
* @author 정승용 (jeongsy10@empal.com)
* @version 1.0
*/
class Dog {
String kind; // 품종
int age; // 나이
String name; // 이름
String size; // 크기
String color; // 털 색깔

void seat() { System.out.println("앉는다."); } // 앉다
void standUp() { System.out.println("일어선다."); } // 일어서다
void run() { System.out.println("달린다."); } // 달린다
void stop() { System.out.println("멈춘다."); } // 멈춘다
void bark() { System.out.println("짖는다."); } // 짖는다
}

위의 Dog 클래스를 사용하는 클래스도 만든다.
public class UsingDog {
public static void main(String[] args) {
Dog d = new Dog();
d.name = "바둑이"; // 개에 이름을 부여함.
System.out.println("개의 이름은 " + d.name + "입니다.");
d.run(); // 인스턴스(객체)에게 달리도록 명령함
d.stop(); // 인스턴스 (객체)에게 멈추도록 명령함.
}
}
사용자 삽입 이미지

여기서는 특별한 모양의 main() 메서드를 보게 된다. main() 메서드는 Java 프로그램의 시작 지점을 알려준다.
이번 장에서는 다음과 같은 것들을 살펴보았다.

  1. 클래스를 구성하는 필드와 메서드
  2. 필드에 리터럴(값)을 할당하는 방법
  3. 메서드를 실행하는 방법
  4. 인스턴스를 만들고 사용하는 방법

다음 시간에는 변수에 대해 살펴보도록 하겠다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/08/12 15:09 2008/08/12 15:09
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/13

1. 클래스 (Class)
Java를 흔히 객체지향언어라고 한다. 객체란 무엇인가? 객체는 현실 세계에서 접할 수 있는 모든 사물과 같은 개념이다. 가령 개를 예로 들겠다. 현실 세계에서 접하는 개라는 객체는 기본적으로 속성과 행동을 갖고 있다. 물론 이런 설명이 조금은 딱딱해 보이지만 궁극적인 목표는 프로그래밍이므로 객체지향 프로그래밍 방법론에 맞춰서 설명을 해야한다.
다시 개로 돌아가보자. 다시 한 번 얘기하지만 개는 속성과 행동을 가지고 있고 이것이 객체의 중요한 두가지 요소가 된다.
객체 (Object) = 속성 (Attribute) + 행동 (Operation)

사용자 삽입 이미지
개를  프로그래밍 언어로 표현해보겠다. 우선 가장 먼저 할 일은 개가 갖고 있는 속성과 행동을 뽑아내는 일이다. 속성은 객체의 특징을 나타내는 요소이다. 이름, 털 색깔, 꼬리 모양, 크기 등이 있을 수 있다. 행동은 여러분이 개에게 명령을 내리고 싶은 걸 표현하면 된다. 여기서 중요한 점은 개가 능동적으로 할 것 같은 행동이 아니라 개에게 명령을 내린다라는 것이다. 객체지향 프로그래밍에서는 객체끼리 서로 메세지를 주고 받는데 이 메세지가 바로 객체의 행동이 되는 것이다.
조금 어려워졌다. 계속 진행해보자. 개를 다음과 같이 표현해보았다.
사용자 삽입 이미지
개의 속성으로 품종, 나이, 이름, 크기, 털색깔을 지정했고, 개에게 내릴 수 있는 명령으로 앉는다, 선다, 뛴다, 멈춘다, 짖는다라고 정했다.
Java 언어로 코딩을 하기위해서는 위의 표현을 그대로 사용해도 좋겠지만 (유니코드를 지원하기 때문에 한글 이름 사용이 가능하다) 영어로 다시 설계를 해보겠다.
사용자 삽입 이미지
영어를 공부하는 시간이 아니므로(^^;) 비슷한 단어를 골라서 표현했다. 여기서 Java의 문법을 잠시 살펴보겠다.
지금부터는 관례적인 표현임을 알려두겠다. 문법적으로 틀린 표현은 아니나 관례상 다음과 같이 사용한다.
클래스 이름은 대문자로 시작한다. 속성(필드, 멤버변수) 이름은 소문자로 시작한다. 동작(메서드) 역시 소문자로 시작한다. 2개 이상 단어가 사용될 때는 띄어 쓰기를 할 수 없기 때문에 두번째 단어의 첫글자를 대문자로 시작하여 읽기 편하게 한다.
그럼 위의 설계를 실제 Java 코드로 바꿔보겠다.
/**
* 클래스명 : Dog
* @author 정승용 (jeongsy10@empal.com)
*
*/
class Dog {
String kind; // 품종
int age; // 나이
String name; // 이름
String size; // 크기
String color; // 털 색깔

void seat() { } // 앉다
void standUp() { } // 일어서다
void run() { } // 달린다
void stop() { } // 멈춘다
void bark() { } // 짖는다
}

이제 개의 설계도가 완성되었으니 개를 만들어 보겠다. 당연히 여기서 만들어지는 개는 컴퓨터의 메모리상에 존재하며 메모리상에 만들어진 개를 가리킬 변수가 필요하다.
/* 메모리상의 개를 가리키는 참조변수 사용 */
Dog d = new Dog();

'd'는 메모리상에 실제로 만들어진 개(객체; Object)를 가리키는 객체참조 (object reference)이다. 'd'의 타입은 Dog 클래스와 같은 타입으로 선언한다. 메모리에 개를 만드는 명령은 'new' 연산자 이다. 결론적으로 위의 명령은 다음과 같다.
Dog 클래스 구조로 객체를 만들고, 이 객체를 Dog 타입의 d라는 이름의 객체참조로 가리킨다.
이제부터 우리는 d라는 이름의 객체참조를 이용하여 Dog 객체를 사용할 수 있게 된다.
그럼 개에게 이름을 지어줘야겠다.
 /* 개에게 이름짓기 */
d.name = "바둑이";

d가 가리키는 객체의 필드(멤버변수)인 'name'에 '바둑이'라는 문자열을 할당한다.
Java 문법책에는 멤버변수와 필드라는 이름이 사용된다. 여기서는 필드라고 부르겠다. 필드는 변수이다. 변수란 값을 저장하는 기억공간이며 그릇이다. 결국 name이라는 이름의 그릇에 '바둑이'라는 값을 할당(대입)한 것이다.
이번에는 개 객체(?)에게 짖도록 명령을 내려보겠다.
/* 객체가 짖도록 명령을 내림 */
d.bark();

bark()는 메서드라고 하며 위의 문장은 다음과 같은 뜻을 갖는다.
d가 가리키는 객체에게 'bark()'라는 메세지(message)를 전달한다.
bark() 메세지를 전달하기 위해서는 bark() 메서드를 호출(call)하면 된다.
(계속...)
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 정샘

2008/08/08 16:36 2008/08/08 16:36
Response
No Trackback , No Comment
RSS :
http://jeongsam.net/rss/response/11