본문 바로가기

개발/Java

자바를 배우고 싶은가?

여러분은 자바를 배우고 싶은가?

자바는 1995년 이후로 계속적인 인기를 얻어 많은 개발자들이 사용하고 있는 프로그래밍 언어가 되었다현재 대부분의 프로젝트가 자바로 진행되고 있을 만큼 그 인기는 계속되고 있으며 특히 웹 솔루션에 있어서 자바는 다른 언어보다 가장 선호되는 언어이다또한 자바는 많은 사람들이 쉽게 배울 수 있는 언어이고 객체지향 프로그래밍인OOP(Object Oriented Programming)를 배울 수 있는 가장 대표적인 언어이기도 하다그래서 많은 학원과 학교에서 교육용으로 사용되고 있다.

이러한 여러 이유로 인해 자바는 프로그래밍에 입문하는 사람들에게 지속적인 관심을 받고 있다하지만 모든 프로그래밍 언어가 그렇듯이 꾸준한 관심과 노력 없이는 흥미를 얻을 수도 없을 뿐만 아니라 실력도 늘지 않는다자바가 어려운 것일까?

자바는 어렵지 않다. 대부분의 사람들이 자바는 배우기 쉽기 때문에 누구나 금방 익힐 수 있다고 생각한다그래서인지 많은 입문자들이 자바 기초 지식은 무시하고 고급 기술을 먼저 공부하려고 한다하지만 자바가 쉽다는 것은 다른 언어에 비해 쉽다는 것이지 누구나 쉽게 익힐 수 있을 만큼 쉽다는 의미는 아니다그렇기 때문에 고급 기술을 익히면 자연히 기초 지식은 따라올 거라고 생각하는 것은 위험한 생각이다.

모든 것에는 순서가 있다. 가장 먼저 해야 할 것이 있고 가장 늦게 해야 할 것이 있다마찬가지로 프로그래밍 언어도 가장 먼저 배워야 할 것이 있다. EJB, JMS, JNI, SWING 등 자바 관련 고급 기술을 먼저 익히면 자바의 기초 지식은 자연히 배울 수 있다고 생각하는 것은 크나큰 오산이다많은 자바 고급 기술들의 기반은 무엇일까?

자바의 고급 기술들의 기반은 자바의 기본적인 문법에서 시작한다. 자바의 기본적인 문법을 익히지도 않고 어찌 자바의 고급 기술을 배울 수 있겠는가물론 다른 프로그래밍 언어에 통달해 있는 사람이고 머리가 좋다면 가능할지도 모르겠다하지만 대부분은 그렇지 않다그렇다면 자바를 정말 제대로 배우고 싶다면 자바의 기초부터 공부해야 한다그러면 어떤걸 먼저 공부해야 할까?

자바의 기초는 문법이다. 모든 프로그래밍 언어가 그렇듯이 문법은 매우 중요하다물론 자바의 문법을 익히면서 자바가 어떤 언어이고 어떤 사상에 의해 만들어진 언어인지도 배울 수 있다자바를 처음 배우는 사람이 EJB,  Struts, Spring 등을 알 필요가 있을까이런 기술은 기초 문법을 익힌 후에 배워야 쉽게 이해할 수 있다하지만 자바의 기초도 없이 이를 이해한다는 것은 너무 벅찬 일이다그렇기 때문에 가장 먼저 자바의 문법부터 공부해야 한다어떤 식으로 문법이 구성되는지 알아야 다른 기술들도 배울 수 있는 것이다.

그래서 이 책에서는 자바의 기본 지식부터 살펴본다최대한 쉽게 설명하려고 노력하였으며 꼭 필요한 내용들만 담으려고 노력하였다자바를 이미 아는 사람에게 있어서는 많이 부족할지도 모른다하지만 자바를 처음 입문하는 사람과 다른 언어를 이미 알고 있는 사람에게는 많은 도움이 될 것이다왜냐하면 이 책은 입문자가 많은 것을 한번에 알 필요는 없다는 것에 기반하여 흥미가 떨어지지 않도록 최대한 쉽게 설명하고 있기 때문이다그리고 꼭 필요한 내용이 아니라면 너무 깊게 설명하여 읽는 속도를 더디게 하지 않으려고 하였다.

이 책의 기본 지식편은 매우 기초적인 자바 문법을 설명하고 있기 때문에 실무에서 사용하기에는 부족한 감이 없지 않다자바의 문법을 알고 있다는 것은 자바 프로그램을 작성하기 위해 준비가 되어 있는 것으로 볼 수는 있다하지만 문법은 단순히 자바 프로그램을 하는데 지켜야 할 규칙일 뿐 자바 프로그램을 효율적으로 작성하는 방법에 대해서는 알려주지 않는다자바 프로그램을 많이 해 본 사람에게는 노하우(KNOW-HOW)라는 것이 있다이 노하우를 아는 사람은 같은 문법을 적용하더라도 제대로 적용한다이 말은 똑같은 결과를 산출하는 코드라도 좀 더 이해하기 쉽게좀 더 나은 성능을 발휘할 수 있게 코드를 작성한다는 것을 의미한다이러한 지식을 이 책에서는 코드 지식편에 담았다.

여러분들은 이 책의 코드 지식편을 통해 기본 지식편에서 배운 기초 문법을 효율적으로 사용하는 방법에 대해 배울 수 있다코드 지식편에서 설명하는 많은 내용들은 실제 자바 프로그램을 작성하는데 있어서 항상 고려해야 할 문제로 개발자에게 있어서는 매우 기본적인 것이다.그렇기 때문에 코드 지식편의 내용들은 반드시 숙지하여 실제 프로그램을 작성하는데 적용할 수 있도록 해야 한다.

프로그래밍 언어에는 여러가지가 있다오래전부터 사용하던 C, C++ 과 이 책에서 다루고 있는 JAVA 그리고 Microsoft 에서 강력히 지원하고 있는 .NET 등 많은 프로그래밍 언어들이 우리 주변에 있다이 언어들을 잘하기 위해서는 우리가 반드시 넘어야 할 산이 있다바로 기초라는 것이다우리가 어떤 언어를 잘 할 수 있기 위해서는 반드시 해당 언어가 가지고 있는 특징과 문법을 익혀야 한다왜냐하면 특징과 문법을 제대로 알아야 C  C 답게 JAVA  JAVA 답게 사용할 수 있기 때문이다그렇다고 특징과 문법을 너무 자세하고 깊게 다루면 여러분은 프로그램을 작성하기도 전에 JAVA 에 대한 흥미를 잃을 수 있다그래서 이 기본 지식편에서는 최대한 흥미를 잃지 않도록 너무 깊게 설명하기보다는 반드시 알아야 하는 내용들을 위주로 설명하고자 한다분명 JAVA 를 잘하기 위해서는 이 기본 지식편에서 다루고 있는 내용들보다 더 많은 내용들을 알아야 한다하지만 너무 조급해하지 않기를 바란다산 입구에 들어서자마자 정상을 밟을 수 있는 사람은 없기 때문이다여러분이 이 책으로 JAVA 를 학습한다면분명 어느새 자바산 정상에 도달해 있는 자신을 볼 수 있을 것이다.

 1장  객체지향 프로그래밍

1.1 소개
객체지향 프로그래밍(Object-Oriented Programming)은 절차지향 프로그래밍(Procedure-Oriented Programming)과 비교되는 프로그래밍 방법으로 모든 데이터를 객체 단위로 취급하여 프로그래밍하는 것을 말하며 현재 가장 선호되고 있는 프로그래밍 방법 중에 하나이다.

기존의 절차지향 프로그래밍 방법으로 작성해야 했던 C 와 같은 언어들은 행위에 중점을 두어 프로그래밍을 해야 했기 때문에 코드의 양이 많아 질수록 이해하기 힘들고 유지보수 하기 힘든 단점이 있었다. 이러한 단점을 보완한 것이 객체지향 프로그래밍이다. 1960년 중반에 SIMURA 라는 시뮬레이션 언어에서 유래한 객체지향 개념이 1970년대 Smalltalk 를 통해 구체화되어 많은 이들에게 관심을 끌기 시작하였다. 그 뒤 1995년 객체지향 개념을 적용한 자바가 세상에 모습을 드러내면서 많은 이들이 자바를 실제 프로젝트에 사용하기 시작하였다.

객체지향 프로그래밍 개념에서 말하는 객체(Object)는 우리가 주변에서 접할 수 있는 자동차, 건물, 비행기 등으로 볼 수 있으며 이러한 객체를 추상화하여 표현한 것을 클래스라고 한다. 그렇기 때문에 객체를 사용하기 위해서는 먼저 클래스를 구체화 시켜야 한다. 이렇게 구체화된 객체를 인스턴스(Instance)라고 한다.

객체지향 프로그래밍 언어는 모든 부분을 객체 단위로 구성하고 이를 조합하여 사용하는 방식이기 때문에 객체만 잘 구성하면 전체 프로그램을 쉽게 개발하고 유지보수할 수 있다.

이러한 객체지향 프로그래밍은 절차지향 프로그래밍과 구분되는 여러 특징을 가지는데 그 중에서 가장 중요한 상속, 다형성, 캡슐화를 객체지향 프로그래밍의 3대 특징이라 한다.

객체지향 프로그래밍의 특징을 살펴보면 다음과 같다.
 

1.2 객체(object)
객체지향 프로그래밍은 시간적으로 발생하는 행위에 중점을 두는 것이 아니라 객체에 중점을 두어 프로그래밍을 하는 방식이기 때문에 전체 프로그램은 객체들의 조합으로 구성된다. 
그렇기 때문에 이러한 객체를 얼마나 잘 추상화하여 클래스로 표현할 수 있느냐가 전체 프로그램의 완성도를 결정한다.

그림 1-2-0 실생활에서의 객체
실세계에 있는 자동차, 사람같은 객체의 상태와 행위를 객체지향 프로그래밍 언어에서 사용하기 위해서는 변수와 메소드로 추상화해야 한다. 여기서변수는 객체의 상태를 저장하기 위해, 메소드는 객체의 행위를 표현하기 위해 사용된다.


1.2.1 캡슐화(Encapsulation) 
객체는 상태와 행위를 가진다. 이를 추상화하여 클래스로 만들면 상태는 변수로, 행위는 메소드로 표현할 수 있다. 기본적으로 객체는 행위의 결과 없이 상태가 변경될 수 없는 것을 전제로 하기 때문에 클래스의 변수는 반드시 메소드를 통해서만 변경될 수 있도록 해야 한다. 이렇게 메소드를 통해서만 변수를 제어할 수 있게 작성된 클래스를 캡슐화되었다고 한다. 
 
그림 1-2-1 캡슐화(Encapsulation)
 캡슐화는 모듈성(Modularity)과 정보은닉(Information hiding)의 장점을 제공한다. 모듈성은 생성된 객체가 다른 객체에 영향을 받지 않고 독립적으로 동작할 수 있는 것을 말하며 정보은닉은 메소드를 통해서만 변수에 접근할 수 있도록 클래스를 작성하여 불필요한 정보를 외부에 노출하지 않도록 하는 것을 말한다. 
 
 
1.2.2 상속(Inheritance) 
자식 클래스에서 부모 클래스의 형질을 물려 받아 사용하거나 재정의하여 사용하는 것을 상속이라고 하며 이는 객체지향 프로그래밍 언어의 대표적인 특징 중 하나이다. 이러한 상속을 통해서 클래스를 작성하면 같은 코드를 여러 번 작성하지 않아도 되기 때문에 소스 코드의 재사용성을 높일 수 있다. 
 
그림 1-2-2 상속(Inheritance) 
[TIP&TECH] 
상속 관계를 표시할 때는 자식 클래스(SportsCar)에서 부모 클래스(Car)로 화살표를 그린다. 즉 화살표의 머리를 부모 클래스로 향하게 그린다 
   
  
1.2.3  메시지(Message) 
객체지향 프로그래밍에서 메시지는 객체간의 통신을 위해 사용한다. 객체들은 캡슐화되어 있기 때문에 특정 객체에게 어떤 기능을 수행하게 하기 위해서는 객체의 메소드를 호출해야 한다. 이렇게 어떤 기능을 하도록 객체에 명령을 내리는 행위(메소드를 호출하는 행위)를 객체지향 개념에서는 메시지라고 한다. 
 
그림 1-2-4 메시지(Message) 
1.2.4  다형성(Polymorphism) 
다형성이라는 것은 메시지를 받는 객체에 따라 다른 반응을 보일 수 있는 것을 말한다. 
예를 들어 인터페이스 Vehicle 이 있고 이를 구현한 클래스 Airplane 과 Car 가 있다고 했을 때 Vehicle 인터페이스의 move() 메소드는 Airplane 과 Car 클래스 모두 구현해야 한다. 그렇지만 Airplane 과 Car 의 move() 메소드는 해당 클래스의 성질에 맞게 구현되어야 하기 때문에 서로 다른 동작을 한다. 즉 같은 메소드의 호출에도 불구하고 호출되는 객체에 따라 실제 동작이 달라질 수 있는 것을 다형성이라고 한다. 좀 더 쉬운 예를 실생활에서 찾아본다면 리모콘을 들 수 있다. 국내 인터넷 회사에서 제공하는 IPTV를 신청하면 셋탑박스와 리모콘을 제공해준다. 이 리모콘에는 TV와 셋탑박스를 키고 끌 수 있는 버튼과 TV와 셋탑박스를 한 번에 키고 끌 수 있는 버튼도 제공해주고 있다. 이 버튼을 누르면 TV도 켜지고 셋탑박스도 겨지는 것이다. 즉 버튼은 한 개이지만 이 버튼은 TV에서는 TV를 키게 하고 셋탑박스에서는 셋탑박스를 키게 하는 것이다. 이것이 바로 객체에 따라 동작이 달라지는 다형성의 예로 볼 수 있다.
 
그림 1-2-5 실생활에서의 다형성
 이러한 다형성은 객체지향 개념에서 매우 중요한 개념으로 이를 제대로 이해하기 위해서는 상속, 오버로딩, 오버라이딩이라는 개념을 이해할 필요가 있다. 그렇기 때문에 지금은 다형성에 대해 이해가 잘 되지 않더라도 그냥 넘어가도록 하자. 왜냐하면 자바로 직접 프로그램을 작성해보고 인터페이스 및 관련 개념들에 대해서 익히면 다형성이라는 개념도 자연스럽게 이해할 수 있기 때문이다.
 

1.3 클래스, 객체 
클래스는 객체지향 프로그래밍의 핵심인 객체를 표현한 설계도이다. 클래스를 프로토타입(prototype) 또는 템플릿(template) 이라고 하는데 그 이유는 클래스가 프로그램에서 실질적인 기능을 하지 못하기 때문이다. 클래스는 단순히 변수와 메소드를 정의할 뿐이며 실제로 프로그램에서 사용되기 위해서는 클래스를 구체화시켜 객체를 생성해야 한다. 클래스를 통해 구체화된 객체는 메모리 할당과 초기화 과정을 거쳐 다른 객체와 메시지를 통해 서로 통신할 수 있다. 클래스와 객체을 좀 더 쉽게 이해하고 싶다면 클래스를 집 설계도로 보고 객체를 설계도에 대로 지어진 실제 집이라고 보면 된다. 
  
그림 1-3-0 클래스(설계도)와 객체(실제 집)
1.4 실행 단계 
자바 프로그램을 실행하기 위해서는 자바 소스 파일을 작성하고 컴파일하여 클래스 파일을 생성해야 한다. 여기서 클래스 파일은 자바 인터프리터에 의해 자바가상머신에서 실행될 수 있는 바이트 코드이다. C 와 같은 프로그래밍 언어는 소스 파일을 컴파일하면 실행 파일이 생성되어 운영체제에서 바로 실행할 수 있지만 자바는 컴파일하여 생성된 클래스 파일을 운영체제에서 바로 실행할 수 없고 반드시 자바가상머신 상에서 실행해야 한다. 이러한 실행 방식으로 인해 초기에는 자바가 다른 프로그래밍 언어보다 느리다는 평가를 받아왔지만 하드웨어의 발달과 자바가상머신의 개선으로 인해 속도상의 문제는 많이 해결되어 지금은 C++ 보다 더 나은 속도를 보인다는 평가를 받기도 한다. 
 
자바 실행 단계를 그림으로 표현하면 다음과 같다. 
 
그림 1-4-0 자바 실행 단계
[TIP&TECH] 
자바 프로그램을 작성하고 실행하기 위해서는 먼저 JDK 를 설치해야 한다. 이에 대한 자세한 방법은 [기타 지식편]을 참고하기 바란다. 
 
자바 프로그램을 실행하기 위해서는 가장 먼저 확장자가 java인 소스 코드를 작성해야 한다. 그리고 javac 명령어를 이용해서 컴파일하여 확장자가 class 인 파일을 생성하고 마지막으로 이 클래스를 java 명령어를 사용하여 실행해야 한다. 이러한 일련의 순서를 각 단계별로 살펴보도록 하자.
 
1) 소스 코드 
윈도우에서 메모장을 열어 소스 코드를 다음처럼 작성하고 Test.java 라는 이름의 파일로 c:\ 에 저장한다. 
public class Test {
    public static void main(String[] args) {
        System.out.println("Hello World!!");
    }
}
 
2) 컴파일 
윈도우에서 커맨드(Command) 창을 실행시키고 Test.java 가 위치한 c:\ 로 이동한다. 그리고 파일 확장자를 포함하여 다음과 같이 입력한다. 그러면 c:\ 에 Test.class 파일이 생성된 것을 확인할 수 있다. 
c:\>javac Test.java 
 
 
[TIP&TECH] 
커맨드 창을 실행하는 방법은 윈도우 버전에 따라 조금은 다르지만 커맨드 창을 실행하는 윈도우 명령어는 동일한다. 
 
윈도우 7에서는 키보드에서 윈도우 키를 누르고 cmd를 입력한 후 엔터 키를 눌러 열 수 있다.
3) 실행 
컴파일과 마찬가지로 c:\ 에서 다음과 같이 명령어를 입력한다. 이때 클래스 파일의 확장자를 입력하지 않도록 한다. Test 클래스 파일을 실행하면 화면에 "Hello World!!" 가 출력되는 것을 확인할 수 있다. 
c:\>java Test 
 
방금 여러분은 자바 프로그램을 작성해서 실행하였다. 그러나 아직 작성한 자바 프로그램에 선언되어 있는 public, static 등이 무엇인지 잘 모를 것이다. 하지만 이에 대해서는 차후에 살펴보도록 할 것이니 지금은 단지 자바 프로그램을 작성하기 위해서는 가장 먼저 소스 코드를 작성해야 하고 그 다음에 소스 코드를 컴파일하고 실행해야 한다는 것만 기억하기를 바란다. 
 
윈도우 XP에서는 윈도우 실행창에서 cmd를 입력하고 확인 버튼을 클릭해서 열 수 있다.