본문 바로가기

JAVA

객체지향을 위한 자바 언어의 구조와 원칙

 

객체지향에 대해 모르신다면 본 글을 읽으시기전에 꼭 이전 발행 글을 읽으시길 권장합니다.

 

2022.05.16 - [컴퓨터 사이언스] - 객체지향 프로그래밍, 그 철학에 관하여 - 1 기초 개념, 탄생 배경

 

객체지향 프로그래밍, 그 철학에 관하여 - 1 기초 개념, 탄생 배경

 C++, JAVA와 같은 프로그래밍 언어를 공부하다보면 필수적으로 마주치는 개념이 바로 그 이름도 이상한 '객체지향 프로그래밍(Object-oriented programming)'이다. 자료형과 연산자 공부하고 알고리즘 문

yunjuniverse.tistory.com

2022.05.16 - [컴퓨터 사이언스] - 객체지향 프로그래밍, 그 철학에 관하여 - 2 객체 개념 심화, 특징

 

객체지향 프로그래밍, 그 철학에 관하여 - 2 객체 개념 심화, 특징

이전 글을 읽고 오시면 훨씬 이해가 쉽습니다! 2022.05.16 - [컴퓨터 사이언스] - OOP(Object-oriented programming), 그 프로그래밍 철학에 관하여 - 1 기초 개념, 탄생 배경 OOP(Object-oriented programming),..

yunjuniverse.tistory.com

2022.05.23 - [JAVA] - 자바(JAVA)란 무엇인가? What is JAVA?

 

자바(JAVA)란 무엇인가? What is JAVA?

세상에는 정말 정말 수많은 프로그래밍 언어들이 존재한다. 그러나 한국에서 백엔드 개발을 배우고자 하는 사람이 무조건 배우는 언어는 이 중 커피향이 나는 그 언어 자바(JAVA)이다. 특히 자바

yunjuniverse.tistory.com

 

객체지향과 자바가 어떤 개념인지 윗 글에서 파악했다면, 자바가 객체지향 패러다임을 지원하기 위해 어떤 형태로 언어를 구조화 했는지 알아보며 자바의 기본 개념을 공부하기 위한 기초를 쌓아보자.

 

앞서 자바는 객체지향 패러다임을 지원하기 위해 개발된 언어라는 설명을 했다.

 

자바는 '객체(Object)'라는 기본단위로 만들고자 하는 프로그램의 기능을 구분한다. 객체는 남들에게 불필요한 자신의 데이터와 코드는 감추고 접근을 제한하며 프로그램의 부품으로서 기능한다. 예를 들어 로봇 프로그램에서 발이라는 기능을 하는 부분을 하나의 객체로 구분하여 작성하는 것이다. 그리고 굳이 필요 없는 발을 움직이는 원리에 해당하는 데이터와 코드는 감추고, 발의 기능만 외부로 노출시킨다.

 

따라서 자바는 크게 4가지 원칙을 코드 구조로 구현해야한다.

 

1. 객체는 여러 개를 만들어 질 수 있어야 한다.(클래스를 이용한 객체, 인스턴스 생성)

2. 객체지향 프로그래밍 방법론의 핵심인 데이터와 명령코드의 결합을 만들어 내야한다. (필드와 메소드) 

3. 객체는 여러 개일 수 있기 때문에 각 객체를 식별할 수 있는 표식이 있어야 한다. (식별자)

4. 객체 내부의 쓸데 없는 데이터는 가릴 수 있어야 한다. (접근제어자)

 

이제 자바가 첫 번째 원칙을 구현하는 방식을 보자.

1. 객체는 여러 개를 만들어 낼 수 있어야 한다.

Answer of JAVA: 자바는 객체를 여러개 만들 수 있도록 코드에 클래스와 인스턴스를 정의했다.

 

첫 번째 원칙을 실현하기 위해 자바는 '클래스(Class)'라는 개념을 도입한다. 클래스는 객체의 정보를 미리 저장해두고 객체를 만들어 낼 수 있도록 지원한다. 이 클래스 만들어 놓은 뒤 복제(instantize, 인스턴트화) 하면 실제 객체인 인스턴스(instance)가 생성된다.  이 방법으로 같은 모양의 여러 객체를 만드는 것이다.

 

 

실제 코드 상에서 객체(Object)는 하나의 개념으로만 존재하며 실제 코드 상에는 클래스와 객체의 실제 복제물인 인스턴스(instance)만이 존재한다.

 

클래스야 객체를 만드는 틀로 이해하니까 쉽게 이해하는 경우가 많다. 하지만 인스턴스와 객체에 대해 헷갈리는 사람들이 많은데, 정확히 짚고 넘어가자. 

 

본인을 '애플'이라고 가정해보자. 자바 객체지향의 세계에서 맥북을 생산해야한다고 하면 어떻게 만들 수 있을까? 

 

일단, 맥북을 만들 설계도면이 필요하다. 디스플레이, 입력기기, 출력기기, CPU, 그래픽카드 등 다양한 부품의의 규격을 정하고 소프트웨어의 구동방식 등을 설계도 안에 집어 넣는다. 이렇게 맥북을 만들 방법을 담은 것을 자바에서는 클래스(Class)라고 한다.

 

클래스 = 맥북의 설계도

 

그리고 이 설계도면이 만들 상품을 '맥북'이라고 명명한다. 이 맥북이라는 상품의 개념이 자바에서의 '객체'이다. 그런데 우리가 중요하게 생각해야 할 부분은 여기서 말한 맥북(객체)은 실제로는 만질 수 없는 추상적인 존재일 뿐이라는 것이다. 

 

 

 

'애플이 맥북을 개발했다.'라는 말을 살펴보자. 여기서 맥북은 실제로 내가 만져볼 수 있는 대상이 아닌 일반적인 개념으로서의 맥북을 말하는 것이다. 이 개념에서의 맥북은 하나만이 존재한다.

 

'내가 가진 맥북이 망가졌다.'에서 맥북은 실제 구현된 맥북인 것이다. 내 맥북이 망가졌다고 맥북이라는 개념 자체가 망가지거나 영향을 받지는 않는다. 이렇게 실제로 구현된 맥북을 자바에서 '인스턴스'라고 한다.

 

'애플이 맥북을 개발했다' 에서의 맥북 == 객체

'내가 가진 맥북은 망가졌다.' 에서의 맥북 == 인스턴스

 

즉, 자바에서 객체는 클래스로 정의를 내린 '구현 개념'이고, 인스턴스는 그 개념의 실제 생산물이다. 마지막으로 클래스는 객체에게 부여하기 위한 데이터와 메소드(명령 코드)를 담은 '틀'이다.

 

마지막으로, 컴퓨터에서 실제 구현이라는 말은 무엇일까? 바로 실제 메모리에 할당된 것을 실제 구현이라고 할 수 있다. 즉, 클래스를 메모리에 할당시켜 놓고 이를 객체의 형태로 복제하여 메모리에 할당(실제로 구현)한다면 '클래스를 인스턴스화(실제 구현, 메모리에 할당)' 했다고 한다.

 

결론을 내리자.

 

자바는 객체라는 개념을 구현하기 위해  '클래스기반 객체지향 프로그래밍'을 지원한다. (다른 방법으로는 객체를 만들고 복사하는 방법인 프로토타입 기반이 있다.)  

 

 

 

2. 객체는 여러 개일 수 있기 때문에 각 객체를 식별할 수 있는 표식이 있어야 한다.

Answer of JAVA: 객체를 만드는 클래스, 변수 등에 이름을 붙여 사용한다.

표식이 필요하다는 말은 객체를 구별할 수 있는 이름표가 필요하다는 말과 같다. JAVA에서는 객체를 구성하는 각각의 요소에 붙여줄 수 있는 식별자(Identifier)를 넣어준다.

객체를 구성하는 요소에 붙여주는 라벨

 

말이 조금 어려운데 그냥 이름을 붙여주면 된다.

 

그런데 이 자바의 식별자도 종류가 있다.

 

1. 시스템 정의 식별자: 시스템이 필요에 의해서 정의해놓은 식별자로 '예약어'라, '키워드'라고도 한다. 예를 들어 boolean, int, Integer, long, char, case, if, for 등이 있다. 

2. 사용자 정의 식별자: 사용자가 정의하는 식별자로 클래스, 변수, 메서드에 이름을 지정할 때 사용한다.

 

중요한건 시스템 정의 식별자인데, 연산을 위해 필요한 조건문과 반복문을 실행하기 위한 if, for, while과 같은 식별자, +, -, =, ==와 같은 연산자와 할당자, 원시타입(primitive type)인 boolean, double과 같은 것들이 시스템 정의 식별자이다.

 

시스템 정의 식별자(예약어)를 총 정리한 표를 확인해보고 싶다면 아래에서 확인해보자.

 

https://www.w3schools.com/java/java_ref_keywords.asp

 

Java Keywords

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

 

시스템이 미리 정의해놓은 식별자가 있다는 것은 아무 이름이나 막 지으면 안된다는 것을 의미한다. 만약 1과 93과 같은 정수 값을 가지는 변수(값을 담기 위한 틀이라고 이해하자) 이름을 int라고 지어버리면 자바에서 오류가 발생한다.

 

여기서 식별자의 이름을 짓기 위한 첫 번째 원칙이 도출된다. 바로 식별자의 이름으로 예약어(키워드)를 사용해서는 안된다는 것이다.

 

자 그럼 이름인 식별자를 다른 것으로 아무렇게나 지어도 될까?

 

식별자의 이름을 짓는게 가장 어려운 개발자들....

사실, 식별자의 이름을 짓는 것을 가장 어려워하는 것이 개발자들이다. 그러나 식별자의 실제 이름을 고민하는 것은 차후의 문제로 넘겨주자. 우리가 알아야 할 것은 식별자를 짓기 위한 일반적인 규칙이다.

 

사용자가 정의하는 모든 식별자의 공통 규칙은 

 

1. 숫자를 맨 앞에 사용하지 않는다. 모든 식별자는 영문자로 시작한다.

2. 카멜케이스(camelCase)를 사용한다. 

 

카멜케이스는 개발자들의 이름 짓기 관습(naming convention) 중 하나인데, 띄어쓰기가 필요한 구간의 경우 뒤에 나오는 단어의 첫 문자를 대문자로 사용하여 구분해주는 것이다.

 

 

공통 규칙도 있지만 각기 다른 규칙도 있다. 일반적으로 사용자가 정의하는 식별자가 필요한 곳은 클래스, 변수, 메소드(명령코드)로 나누어진다.

 

대표적으로 다른 규칙을 지닌 것이 클래스인데, 클래스는 객체를 정의하는 틀로 다른 요소들과 구분해줘야 할 필요가 있다. 따라서 클래스의 식별자를 정의하는 규칙은 따로 존재한다.

 

클래스의 식별자는 항상 첫 문자를 대문자로 표현하며 항상 명사형으로 지정해준다. 대문자로 지정하는 것이야 그렇다치고 왜 명사형일까? 클래스는 객체를 생산하는 공장이자 틀이다. 공장 이름을 '아이패드 공장'이 아닌 '아이패드를 만들자'라고 짓는 건 이상한 일이다. 

 

이는 객체의 철학적(....) 개념과도 일맥상통하는데 객체는 하나의 '사물'의 개념으로서 존재하는 것이다. 따라서 객체를 만드는 클래스도 객체도 모두 명사형일 수 밖에 없다. 만약 코카콜라의 영어명인 Coca Cola를 카멜 케이스로 쓴다면 cocaCola라고 이름을 지을 수 있다. 만약 이것이 클래스명이라면 CocaCola일 것이다.

 

남은 것은 변수와 메소드, 상수다. 변수(variable)는 데이터의 이름을 짓는 것(정확히는 데이터를 담는 틀)이고 메소드(method)는 명령코드 이름(정확히는 명령코드 뭉치를 담기 위한 틀)을 짓는 것이다. 

 

이 둘은 모두 소문자로 이름을 시작한다. 다만 차이점은 동사형이냐 명사형인가인데, 메소드는 동사형이고, 변수는 명사형이다. 다시말해 명령코드의 이름은 동사이고 데이터는 명사이다. 이 부분은 굳이 설명을 할 필요가 없을 듯 하다.

 

마지막으로 언제나 변하지 않는 값을 가지는 상수(Constant)가 있다. 이 친구는 모두 대문자로 적는다. 그리고 하나 이상의 단어가 합쳐질 때 상수는 카멜케이스가 아닌 언더스코어(_)로 연결한다. 다 대문자라....

 

이제 정리해보자.

 

 

식별자(Identifier)의 1원칙: 시스템 정의 식별자로는 이름을 지어선 안된다. 

식별자(Identifier)의 2원칙: 영문자로만 이름을 시작해야한다. (숫자나 기호, 다른 언어는 불가능)

식별자(Identifier)의 3원칙: 카멜케이스(camelCase)로 띄어쓰기를 구분한다.

식별자(Identifier)의 4원칙: 클래스(Class)는 대문자로 시작하며 명사형으로 이름을 짓는다. CocaCola

식별자(Identifier)의 5원칙: 변수(Variable)는 소문자로 시작하며 명사형으로 이름을 짓는다. cocaCola

식별자(Identifier)의 6원칙: 메소드(Method)는 소문자로 시작하며 동사형으로 이름을 짓는다. makeCoke

식별자(Identifier)의 7원칙: 상수(Constant)는 모두 대문자로 구성되며 띄어쓰기는 언더스코어로 구분한다. COKE_PLAY

 

세 번째 원칙으로 넘어가자

 

 

3. 객체지향 프로그래밍 방법론의 핵심인 데이터와 명령코드의 결합을 만들어 내야 한다. 

Answer of JAVA: 자바는 클래스에 필드(Field, 데이터)와 메소드(Method, 명령코드)라는 개념으로 데이터와 명령코드를 묶어서 지닐 수 있도록 만들었다.

 

세 번째 원칙을 살펴보자. 이제부터는 실제 코드를 보면서 어떻게 원칙을 구현했는지 살펴보겠다. 

 

다음은 프로그래밍 언어를 배울 때 처음으로 마주하는 코드인 "Hello World"를 자바로 작성한 예이다.

 

public class Main {
   public static void main(String[] args) {
   	System.out.println("Hello, World!");
	}
}

 겁나 장황하다. 실제로 자바는 굉장히 Verbose한 것으로 소문난 언어이다.

 

 

이 코드를 하나씩 확인해보자. 키워드 하나 하나씩 뜯어보면 객체와 클래스를 구성하기 위해 필요한 필수 개념이 잡힐 것이다.

 

 

일단 Main이라는 이름 앞에 class라는 키워드가 보인다. 이 코드는 Main이라는 이름을 가진 클래스를 선언한 코드임을 알 수 있다. 

 

class Main

//클래스선언문Class 클래스이름Main

클래스 선언

 

Main 클래스가 선언되었다. 앞서 말했듯 클래스 이름은 대문자로 적어준다.

 

이제 클래스 안에 내용(명령코드와 데이터)을 넣어야 할 차례이다. 앞서 말했듯 자바에서는 내용을 필드(데이터)와 메서드(명령코드)로 정의한다. 클래스의 내용을 작성하기 위해선 { } 중괄호를 선언해주고 그 안에 클래스에 해당하는 데이터를 넣어준다.

 

class Main {}

//클래스선언문Class 클래스이름Main 클래스_데이터_공간_선언{ 클래스_데이터_공간닫음}

클래스 내용을 담을 공간 { } 선언

 

선언해준 { } 중괄호 안에 데이터와 명령코드를 넣어줘야 한다. 자바에서는 데이터를 멤버 변수(memeber variable), 명령코드를 메서드(method)로 명명한다. 이것을 자바는 객체 안에 속성(attribute, 필드, 데이터)기능(fucntion, 메서드, 명령코드)을 가지고 있다고도 한다.

 

명령코드에 해당하는 자바의 메서드는 '메서드이름( ) { }'의 형태를 가진다. 그리고 이름과 내용 사이에  ( ) 소괄호가 하나있는데, 이 부분은 명령을 위한 데이터를 넣어주는 곳이다. 그리고 { } 중괄호 안에는 클래스와 마찬가지로 메서드 실행 시 행동할 내용이 담겨 있다.

 

어라? 메서드랑  클래스의 형태와 거의 똑같은데요?

라는 질문이 나올 수 있다.

 

자바의 메서드(method)가  '메서드이름( ) { }' 이렇게 생긴 이유는 여러 명령을 한번에 담을 수 있도록 명령코드를 감싸야하기 때문이다. 예를 들어 입력 받은 두 개의 데이터를 더하고 출력하는 명령이 필요하다고 해보자. 이 명령은 '더하기'와 '출력하기'라는 두 개의 작은 명령이 필요하다.

 

즉, 우리가 원하는 어떤 기능은 여러 명령이 합쳐서 이루어진 명령 복합체라는 뜻이다. 따라서 명령코드는 여러 명령을 감싸는 형태를 가져야만 한다. 그래서 메서드의 형태와 클래스의 형태는 둘 다 감쌀 수 있는 괄호를 가지는 것이다.

 

class Main {
    main() { 
    	System.out.println("Hello, World!");}
}


//메서드 모양 main() { }
//메서드 안에 명령 코드 넣은 형태 main() { System.out.println("Hello, World!");}

 

이제 Main 이라는 이름을 가진 클래스 안에 main이라는 이름을 가진 메소드가 생겼다. 그런데 앞서 메서드의 ( ) 영역에는 매개변수라는 녀석이 들어간다고 했다. 매개변수는 메서드가 보유한 명령(실행문)을 실행하기 위한 데이터이다.


잠깐!

hello world 출력을 위한 클래스 부분에 String[] args라는 매개변수가 이미 들어가 있다는 것을 확인할 수 있다. 이 부분은 자바의 배열JVM의 원리, main 메서드의 특이성에 대해 사전지식이 있어야 설명이 가능하다. 지금은 main 메서드라는 독특한 녀석은 String[] args라는 매개변수를 가진다고 이해하고 넘어가자.  


class Main {
   int age = 1000;
   main(String[] args) {
   	System.out.println("Hello, World!");
	}
}

main 메서드는 String[] args를 반드시 가진다. 

 

 

이제 어느정도 형태는 완성이 됐다. 

 

그런데 아쉽게도 Hello World 예제에서는 필드(데이터)에 해당하는 부분이 존재하지 않고 main 메서드만 존재한다. 이걸로는 첫 번째 원칙을 제대로 확인할 수 없으니 그냥 데이터에 해당하는 부분을 하나 넣어줘보자. 여기서 실수의 데이터 타입을 가지는 데이터를 만들어준다. 필드를 삽입하는 방식은 다음과 같다.

 

여기서는 int 타입을 가지는 age라는 변수에 1000이라는 데이터 값을 넣어주었다. 데이터를 넣어줄 때는 이렇게 데이터 타입과 데이터를 담을 변수를 먼저 선언해준 뒤 할당자를 이용해 데이터를 넣어준다. 그리고 자바에서 각각의 코드 뒤에는 명령이 끝났다는 표현인 ; 쌍반점(세미콜론)이 반드시 들어가야 한다. 이렇게 해야 각각의 명령을 나눌 수 있다. 

 

class Main {
	// 데이터에 해당하는 부분 삽입
	int age = 1000;
    main() { 
    	System.out.println("Hello, World!");}
}


//메서드 모양 main() { }
//메서드 안에 명령 코드 넣은 형태 main() { System.out.println("Hello, World!");}

 

이 부분까지 보면 자바는 데이터와 명령코드를 필드와 메서드로 나누어 클래스에 저장함으로써 객체지향을 구성하는 세 번째 원칙을 구현했다는 것을 알 수 있다.

 

4. 객체 내부의 쓸데 없는 데이터는 가릴 수 있어야 한다.

Answer of JAVA: 자바는 접근제어자를 통해 객체 내부 데이터에 접근을 조정할 수 있도록 한다.

이제 접근제어자(Access Modifier)에 대해 알아봐야한다. 세 번째 원칙까지 왔지만, 우리는 아직 Hello World 코드를 완성하지 못했다.

 

class Main {
   int age = 1000;
   main(String[] args) {
   	System.out.println("Hello, World!");
	}
}

우리가 만든 코드와

 

public class Main {
	int age = 100;
   public static void main(String[] args) {
   	System.out.println("Hello, World!");
	}
}

 

완성된 코드를 다시 보자. 

 

아직 우리가 모르는 public, static, void가 존재한다. static과 void는 지금 배워야 할 키워드(예약어)는 아니다. 여기서 중요한건 public이라는 녀석이다.

 


나머지 키워드에 대해 간단히만 말하자면 static은 클래스 내에서 메소드를 바로 사용할 수 있도록  미리 클래스 내 메소드의 내용을 메모리에 저장해둔 것이고 void는 반환 값이 없는, 즉 return할 내용이 없는 메소드에 사용하는 키워드이다. Hello World 예제에 이 두가지 키워드가 사용되는 이유은 선언한 클래스를 내에서 바로 콘솔창에 명령을 출력하기 위해서이다. 이 두 가지 키워드는  반환이나 메모리 구성에 대한 사전지식이 필요하기 때문에 이 글에서는 그냥 넘어가겠다. 차근차근 배우자.


 

이제 public이 무슨 역할을 하는지 알아보자. public은 접근제어자의 하나이다. 접근제어자는 객체에 접근할 수 있는 범위를 결정한다. 이 기능을 통해 OOP의 중요 특성인 캡슐화를 구현하는 것이다.

 

접근제어자는 객체 안에 있는 데이터와 메소드는 접근 할 수 있는 한계를 정해놓고 쓸데 없는 데이터를 가려 객체 간 커뮤니케이션을 원활하게 한다. 컴퓨터의 기본 원리를 몰라도 컴퓨터를 사용할 수 있는 것과 마찬가지다. A객체의 연산을 사용하고자 하는 다른 B객체가 굳이 그 객체의 내부를 알아야 할 필요가 있을까? 결과 값만 필요한 B객체는 A 객체의 결과만 받아오면 된다. 이런 원리를 자바는 접근제어자를 이용해 구현한다.

 

자바는 접근제한자를 통해서 캡슐화, 정보은닉, 추상화를 구현한다. 이를 통해 데이터 보호, 객체 유지보수 편의성을 증가시킨다. 접근제어자의 종류와 범위를 정리해보자면,

 

접근제어자
(Access Modifier)
사용 대상 접근 가능 범위 접근 불가
public 클래스, 필드, 메소드(생성자 포함) 모두 없음
protected 필드, 메소드(생성자 포함) 같은 패키지 자식 클래스가 아닌 다른  패키지의 클래스
default 클래스, 필드, 메소드(생성자 포함) 같은 패키지 또는 자식 클래스 다른 패키지의 클래스
private 필드, 메소드(생성자 포함) 클래스 내부 클래스 외부

 

이렇게 4종류가 있다. 참고로 생성자라는 개념이 새로 등장했는데, 이는 메소드의 일종으로 객체를 만드는 특수한 메소드이다. 여기서는 그냥 메소드로 이해하면 된다.

 

여기서 사용 대상이 특이한 건 클래스다. protected와 private는 클래스에서 쓸 수 없는데, 두 접근제어자는 클래스 내부에 있는 필드와 메소드에만 적용되는 접근 범위이다. 이 두 가지 클래스는 클래스의 관계도 내부에서 작용한다. 

 

protected는 다른 클래스의 자식 클래스까지는 허용을 하는 기준점을 가지고 있고, private는 클래스 내부와 외부를 나누는 기준점을 가지고 있다. 둘 다 '클래스'를 기준으로 접근을 정의하는 접근 제어자인 것이다. 따라서 클래스 자체는 두 접근 제어자를 가지지 않는다.

 

패키지(package)라는 개념도 새로 등장했는데, 클래스가 포함되는 상위 개념이다. 예를 들어, 클래스가 로봇의 발을 담당한다면, 해당 클래스가 포함되는 하체를 패키지로 정의하는 것이다. 자바에서 프로그램을 구성하는 요소를 관계도로 구성하면 다음과 같다. 

 

클래스의 묶음인 패키지 사이에서 클래스 내부의 데이터와 메소드의 범위를 정해 설령 같은 식별자를 가진 메소드나 클래스라도 다른 패키지가 참조할 수 없도록 함으로써 객체간 참조 오류를 막는다. 이는 협업 프로그래밍에서 매우 큰 장점을 가진다. 

 

이번 예제에서는 모든 클래스, 패키지가 참조할 수 있도록 public 연산자를 이용해 범위를 설정했다. 마지막으로 완성된 예제를 보고 끝내겠다.

 

public class Main {
	int age = 100;
   public static void main(String[] args) {
   	System.out.println("Hello, World!");
	}
}

/**
접근제어자 클래스 선언 클래스식별자 {
	타입선언 변수이름선언 할당자 값 세미콜론
    접근제어자 static void main메소드선언 (String배열 매개변수 선언){
    콘솔출력 명령어(값) 세미콜론
    }
}
**/

 

 

지금까지 자바에서 객체지향 프로그래밍을 구현하는 방법에 대해 알아보았다. 각각의 자세한 내용은 차후에 발행할 '스낵 자바'를 통해 다뤄보도록 하겠다.