1. Java 입문


javalogo

Overview

Java는 1990년 James Gosling에 의해 개발된 프로그래밍 언어로 이식이 용이하고(portable), 분산 환경(distributed environment)을 지원하며, 실시간(real time)이고, 안정성(reliable) 있는 객체지향 프로그래밍 언어(object-oriented programming language)로서 인터넷 환경에서 가장 많이 사용되고 있다.


프로그램 기본 요소

1. Java 프로그램

class chap1_1 {
    static int count = 1;
    public static void main(String args[]) {
        System.out.println("The Count is : " + count);
    }
}

Java 프로그램은 메소드(method)를 포함하고 있는 클래스(class)들로 구성된다. 메소드는 일반 프로그램의 함수(function)나 프로시저(procedure)에 대응된다. 프로그램의 실행은 main() 메소드를 호출하는 것으로 시작된다.

위 프로그램에서 main()을 볼 수 있는데 String[]은 이 main()의 매개변수 타입이고 void는 이 main() 메소드의 반환 타입으로 반환되는 결과가 없다는 것을 명세하는 것이다.

println()은 Java의 기본 출력 메소드이다. 여기서는 이 rintln() 메소드를 이용하여 스트링과 정수값을 한 행에 출력하고 있다.


2. 기본 타입

프로그램에서 사용되는 모든 변수는 반드시 타입이 선언 되어야 한다. Java에는 시스템이 정의한 기본 타입(primitive type)과 사용자가 정의한 사용자 정의 타입(user-defined type)이 있다.

기본 타입에는 정수(integer)를 표현하기 위한 int, byte, short, long 타입이 있다. 실수(floating-point number)에 대해서는 float과 double타입이 있다. double은 유효 숫자가 더 크므로 일반적으로 float보다는 double을 더 많이 사용한다. char 타입은 한 문자를 표현하는데, 유니코드(unicode) 표준을 지원하므로 16비트로 표현된다. 마지막 기본 타입은 true, false 값을 갖는 boolean 타입이다.

사용자는 이 타입을 이용하여 자유롭게 class라고 하는 새로운 사용자 타입을 정의하여 사용할 수 있다.

2.1. 상수

프로그램 실행에 관계없이 변하지 않는 상수(constant)에는 정수 상수(integer constant), 실수 상수(floating point constan), 문자 상수(character constant), 스트링 상수(string constant), 불리언 상수(boolean constant) 등이 있다. 이 상수를 때로 리터럴(literal)이라고 한다.

2.2. 변수

모든 변수(variable)는 사용하기 전에 타입과 이름을 명세해야 한다. 프로그램에서 변수 이름으로 사용되는 식별자(identifier)는 임의의 길이의 스트링으로 첫 글자는 문자, _, $가 올 수 있고 다음 글자에는 숫자도 올 수 있으며 대소문자 구별을 한다.

2.3. 터미널 입력과 출력

readLine()과 printLine() 메소드는 기본적인 포멧으로 터미널 입력과 출력을 할 수 있게 한다. 표준 입력 스트림은 System.in이며, 표준 출력 스트림은 System.out이다. 기본적인 포맷으로 입출력을 하기 위해 String 객체를 사용하여야 하는데 두 String을 연결하기 위해 + 연산자를 이용한다.


3. 제어문

하나의 단순 명령문은 세미콜론 ;으로 끝난다. 하나 또는 여러개의 명령문을 중괄호 { }로 묶어 하나의 명령문과 같이 취급하게 할 수 있는데 이것을 블록(block)이라고 한다.

제어문(control statement)은 명령문의 실행 순서를 제어하기 위해 사용하는 명령문이다.

여기에는 조건문(conditional statement)과 반복문(repeat statement)이 있다.

3.1. 조건문

조건문의 if와 switch문은 조건식의 결과에 따라 명령문을 선택적으로 실행하게 한다. if 문의 일반적인 형식은 다음과 같다.

if(조건식)
    명령문1
else
    명령문2

여기서 명령문 1과 2는 ;로 끝나는 단순 명령문이나 { }로 묶여진 블록이 된다. 이 외에도 ? : 연산자를 사용하여 조건식을 단순화할 수 있다.

다음 두 명령문은 동등하다.

if (a > b) then x = a; else x = b;
x = (a > b) ? a : b;

switch문은 수식의 결과에 따라 여러 코드로 분기한다. 수식은 정수식이어야 하며 수식의 결과값과 일치하는 case 문의 명령문을 실행산다.

이 때 case 명령문의 마지막에 break 문이 있으면 switch문의 실행이 끝내게 된다. 만약 수식의 값과 일치하는 case 문이 없을 경우 default 문을 실행한다.

switch (수식) {
    case 값1: 명령문1
    case 값2: 명령문2
    default: 명령문3
}

3.2. 반복문

반복문은 for, while, do-while 세가지 유형이 있다.

for 문은 일반적으로 다음과 같다.

for(초기화문; 조건식; 증감문)
    명령문

for문의 실행은 먼저 초기화문이 실행되고, 조건식을 검사한다. 조건식의 값이 true라면 명령문을 실행하고 다시 증감문을 실행한다. 이후 조건식의 값이 false가 될때까지 반복적으로 실행한다.

while 문은 일반적으로 다음과 같다.

while (조건식)
    명령문

while문의 경우에는 먼저 조건식을 검사하여 값이 true이면 명령문을 실행하고 조건식이 false가 될 때 까지 조건식 검사와 명령문을 반족적으로 실행한다.

do-while문의 경우 먼저 명령문을 실행한 다음 조건식을 검사한다. 일반적으로 다음과 같은 구조를 갖는다.

do
    명령문
while (조건식);

4. 클래스

Java 프로그래밍 언어는 다른 객체 지향 프로그래밍 언어와 같이 클래스(class)와 객체(object)를 사용하여 프로그래밍 문제를 해결하는 도구를 제공하고 있다. 모든 객체는 각각 어느 한 클래스에 속한다.

클래스는 일종의 데이터 타입이라 볼 수 있다. 클래스는 크게 필드(field), 메소드(method)로 구성된다. 필드는 데이터를 저장하는 변수고 메소드는 이 필드의 데이터를 처리하는 연산자 이다.

다음은 두개의 x좌표, y좌표로 나타내는 Point 클래스이다.

class Point {
    public double x;
    public double y;
    public void clear() {
        x = 0;
        y = 0;
    }
}

위 클래스는 점의 x좌표와 y좌표를 나타내는 두 개의 필도, x, y와 이 x, y에 값을 지정하는 메소드 clear()를 가지고 있다. 이와 같이 클래스 정의는 객체가 만들어지는 형태와 이 객체들이 이용할 수 있는 연산자들을 정의하는 것이다.

클래스의 특성은 클래스 내부에 있는 필드의 존재나 메소드의 구현에 대해 외부에 노출시키지 않는다는 것이고 이를 캡슐화(encapsulation)이라고 한다.

캡슐화의 핵심은 외부와의 인터페이스를 위한 부분만 공개하고 나머지 부분은 숨기는 것인데 이것을 정보 은닉(information hiding)이라고 한다. 따라서 클래스에 정의된 멤버들에 대해서는 일반적인 접근을 통제하는 것이 원칙이다.


5. 객체

클래스가 정의되면 이 정의로부터 객체(object)가 생성될 수 있다. 객체는 new라는 연산자를 통해 생성된다. 클래스 정의로부터 하나의 객체를 생성하는 것을 인스턴스화(instantiation)라 한다. 그래서 객체를 인스턴스(instance)라고 한다.

다음은 위에서 정의한 Point 클래스의 두 객체 point1과 point2를 생성하는 코드이다.

Point point1, point2;
point1 = new Point();
point2 = new Point();

여기서 point1과 point2는 먼저 Point 클래스, 즉 Point 타입의 변수로 선언되었는데 이것은 Point 객체를 참조할 수 있는 참조 변수(reference variable)라는 것이다. 객체를 참조한다는 말은 객체가 저장되어 있는 메모리의 주소를 저장하고 있다는 뜻이다.

Java에서 변수 타입은 앞서 설명한 기본 타입(primitive type)과 참조 타입(reference type)이 있다. 기본 타입의 변수는 그 변수가 나타내는 메모리 주소에 값을 직접 저장하지만 참조 타입의변수는 그 변수가 나타내는 메모리 주소에 객체가 아니라 그 객체가 저장되어 있는 주소를 저장한다.

Point 타입의 참조 변수 point1과 point2가 Point 객체를 실제로 참조하기 위해서는 Point 객체를 생성해서 이 참조 변수에 지정해야 한다. Point 객체는 new Point()로 생성시킬 수 있는데, 이 때 new 연산자는 Point 객체를 저장할 수 있는 메모리를 할당받아 그 주소를 반환하는 것이다.

따라서 다음 두 명령문이 실행되면 point1과 point2는 Point 객체를 생성하여 저장해 놓은 메모리 주소를 저장하게 된다. 이것을 보통 객체 point1, point2가 생성되었다고 한다.

point1 = new Point();
point2 = new Point();

이렇게 생성된 Point 객체는 각각 자신만의 필드, x, y를 가지면서 유일하게 참조된다. 따라서 객체 point1에 있는 x의 값을 변경하더라도 객체 point2의 x값에는 전혀 영향을 주지 않는다.

이와 같이 클래스의 각 객체(인스턴스)마다 자기의 필드가 하나씩 만들어지기 때문에 이 데이터 필드들을 인스턴스 변수(instance variable)라고 한다.

6. 메소드

Java의 메소드(method) 정의는 메소드 헤더(method header)와 메소드 본체(method body)로 구성된다. 메소드 헤더는 메소드 이름과 매개 변수 리스트, 반환 타입으로 구성된다. 여기서 매개변수 리스트는 공백일 수 있다. 메소드를 구현하기 위한 실제 코드는 메소드 본체라고 하는 블록{ }으로 이루어 진다. 아래 프로그램은 이러한 메소드 정의와 호출의 예를 보여주고 있다.

class MinTest {
    public static void main(String args[]) {
        int a = 3;
        int b = 7;
        System.out.println(min(a, b));
    }
    // 메소드 min() 정의
    public static int min(int x, int y) {
        return x < y ? x : y;
    }
}

main() 메소드와 같이 메소드 앞에 public static 이라는 키워드가 붙으면 전역함수(global function) 역할을 한다. 메소드 이름 min은 그 메소드의 식별자가 되고, () 속의 매개 변수 리스트는 공백이거나, 각각 명시된 타입의 매개 변수들로 구성된다. return 문은 호출자에게 결과 값을 반환해주기 위해 사용된다. 메소드 min()의 실행 결과 반환 타입은 int인데 아무런 값도 반환하지 않는다고 정의하려면 void 라고 명세한다.


참고 문서

  • 이석호. (2004). 자료 구조와 JAVA. 정익사.





© 2019. by RaP0d

Powered by aiden