
https://edu.goorm.io/learn/lecture/19448/한-눈에-읽는-자바-기초
이 강의 내용으로 작성하였습니다.
JVM(Java Virtual Machine)
1강에서도 설명했듯이 Java는 JVM(Java Virtual Machine)이라는 프로그램을 통해 동작합니다. 조금 더 자세히 설명하자면 Java는 번역가 역할을 실행하는 JAVAC Compiler를 통해 .class 라는 파일로 변환되고, 각 운영체제에 설치되어 있는 JVM이 .class 파일을 실행하는 방식으로 동작합니다.
따라서 JVM을 사용하기 때문에 생기는 특징으로는 다음 세 가지가 있습니다.
Java 프로그램을 실행하고자 하는 컴퓨터에 JVM이 설치되어 있지 않으면 Java 프로그램을 실행시킬 수 없습니다. 하지만 JVM 설치는 매우 간단하니 걱정할 필요 없습니다. Oracle 홈페이지에서 JRE를 다운받아 설치하면 자동으로 JVM이 해당 컴퓨터에 설치됩니다. 일반적으로 자바 개발 환경인 JDK를 설치하면 JRE는 자동으로 같이 설치됩니다.여기서 JRE는 Java Runtime Environment, 즉 자바 런타임 환경의 약자로 다른 소프트웨어를 실행하기 위해 고안된 일종의 소프트웨어입니다. JRE에는 자바 클래스 라이브러리와 자바 클래스 로더, 자바 가상 머신 등이 포함되는데 이건 그냥 읽고 넘어가셔도 좋습니다.
같은 Java 소스코드는 여러 운영체제에서 수정하지 않고 사용할 수 있습니다. 일반적으로 운영체제에 종속되는, 즉 특정 운영체제에서만 사용가능한 프로그램 언어를 Native Language라고 하며 대표적으로 C언어가 있고, 반대로 자바와 같이 여러 운영체제에서 사용할 수 있는 프로그래밍 언어를 Managed Language라고 합니다. Java는 첫번째 Managed Language이며, 최근에는 .NET 과 같은 개발 환경에서 또한 Managed Language 형태로 제공됩니다.
Managed Language는 Native Language보다 실행속도가 느립니다. Byte Code가 각 운영체제에 맞춰서 실행하기 위해서는 JVM이 각 운영체제에 맞는 Native 언어로 변환해주는 작업이 필요합니다. 당연히 Native Language로 개발된 언어는 이런 과정이 필요 없기 때문에, 일반적으로 Java는 Native Language로 개발된 프로그램보다 실행속도가 느립니다.
SDT(Strict Data Type)
자바 혹은 Managed Language의 또다른 특징으로 Strict Data Type이 있습니다.
자료형(Data Type)이란 '프로그래머가 Compiler에게 알려주는 데이터의 속성' 입니다. 3강에서 다시 자세히 설명하겠습니다만, 자료형에는 기본형 및 참조형이 있습니다. Managed Language를 다룰 땐 사용하고자 하는 자료형이 무엇인지 정확하게 표현해야 하며, 상황에 따라 꼭 맞는 자료형을 사용해야 합니다. 이를 Strict Data Type이라고 합니다.
C 계열 언어를 먼저 공부하신 분들을 위해 추가 설명드리면, C 계열의 언어는 Managed Language가 아니기 때문에 Data Type을 정확하게 사용하지 않아도 됩니다. 예를 들면 조건문(if)에서 조건을 작성하는 공간에 1 혹은 0과 같은 int형 변수를 입력해도 if 조건문이 문제 없이 동작할 수 있습니다. 하지만 자바에서는 if 문 안의 조건에 true 혹은 false와 같은 boolean 형이 필수 입력되어야 합니다. 3강에서 좀 더 자세히 말씀드리겠습니다.
컴퓨터는 프로그램을 Memory라는 공간에서 실행하게 됩니다. 프로그래머는 Memory라는 공간에서 데이터를 가공 및 저장하여 프로그램을 동작시키게 되는데, 이 과정 중 사용되지 않는 공간이 필연적으로 발생합니다. Garbage Collector는 이러한 사용되지 않는 공간을 자동으로 청소해주는 기능입니다. 이 유용한 기능은 프로그래머가 메모리 관리하는데 소모하는 에너지를 획기적으로 줄여 작업피로도를 낮춰줍니다. 처음 프로그램을 개발하시는 분들은 이게 무슨 말인지 잘 이해되지 않을 것입니다. 지금은 우선 이런 기능이 있구나 정도만 이해하고 넘어가시면 되겠습니다. (자세한 내용은 제8강 배열 소개에서 계속 됩니다.)
C 혹은 C++를 개발해보신 개발자들을 위해 좀 더 자세히 설명드리자면, C와 C++에서는 배열 혹은 포인터 등에서 메모리 동적 할당한 후 delete 혹은 dealloc 등과 같은 메모리 해제 처리를 적절히 해주지 않았을 때 Memory Leak와 같은 오류가 발생하는 경우를 겪어보셨을 것입니다. 자바에서 Garbage Collector는 프로그램의 백그라운드에서 동작하면서 구간 종료 시( " } " 에 도달할 시) 필요없는 메모리를 강제로 반환해주는 아주 유용한 기능입니다.
POP(Procedure Oriented Program)
POP를 사용하는 언어로는 C, VB, PASCAL 등이 있습니다. 프로그램이 시작하면 프로그래밍된 순서대로 진행하며, 모든 순서가 종료되면 프로그램 또한 종료됩니다. POP는 다음과 같은 특징을 가집니다.
기능을 우선시하여 프로그래밍합니다. 따라서 OOP에 비해 빠르게 프로그래밍이 가능합니다.
대부분의 함수가 프로그램 내부에서 어디서든 사용 가능한 전역 데이터를 사용하기 때문에 데이터 접근이 용이합니다. 하지만 데이터 접근이 유용하다는 뜻은 반대로 보안성이 낮다는 말과 같습니다.
POP는 데이터의 모듈화가 어렵습니다. 모듈화는 프로그램을 관리가 용이하도록 기능 단위로 분리하는 작업을 의미하는데, 예를 들어 설명하면 로봇을 조립할 때 팔, 다리, 몸통 등을 따로 만들어 연결하는 것과 비슷합니다. 모듈화가 어려운 POP의 경우 데이터 및 기능을 추가해야 할 때 기존에 작성된 프로그램을 수정해야 하며, 프로그램의 크기가 커질수록 유지보수가 매우 어려워집니다. 즉, 로봇에 날개를 달아야 할 때 날개를 따로 만들어서 부착하는 것이 아니라 로봇 몸통에 부품을 일일이 이어 붙여야 한다는 뜻입니다.
OOP(Object Oriented Program)
OOP는 POP의 단점을 보완하여 개발된 개념입니다. 비교적 최근에 개발된 언어들이 OOP를 지원하며, 기능 위주의 POP와는 달리 "객체"라는 개념을 통해 데이터 및 함수를 모듈화하여 프로그램의 유지 보수와 보안성을 강화하였습니다. OOP를 사용하는 언어로는 JAVA, C++, C#, .NET 등이 있습니다. "객체" 라는 개념이 추상적인 개념이라 쉽게 이해하기는 어려운 개념입니다만, 10강에서 클래스를 소개하면서 좀 더 자세히 설명하도록 하겠습니다.
OOP는 크게 4가지 특징을 가지고 있으며 이는 클래스를 다룰 때 꽤 중요한 내용이나 지금은 이해하기 힘든 것이 맞습니다. 가볍게 읽고 지나가시기 바랍니다.
캡슐화: 데이터를 캡슐화(은닉화)함으로써, 상황에 따라 프로그램 외부에서 접근 가능한 데이터를 지정할 수 있습니다. 10강에서 설명할 public, private, protected와 같은 접근자를 통해 프로그래머는 외부에서 접근 가능한 데이터의 종류를 제한할 수 있습니다. 따라서 내부적으로 숨겨야하는 데이터의 접근을 막음으로써 데이터의 보안성이 좋아집니다.
추상화: OOP에서 제공하는 함수/데이터 모듈화의 일종으로써, 객체의 기본적인 틀, 즉 뼈대만 미리 만들어놓을 수 있는 기능입니다. 추상화된 객체는 아래에서 설명할 상속을 사용하여 구체적인 객체로 만들어 사용할 수 있습니다.
상속: OOP에서 제공하는 함수/데이터의 모듈화의 일종으로써, 피상속 객체(부모 클래스)의 데이터 및 함수들을 상속 객체로 그대로 이어 받아 사용할 수 있는 기능입니다. 이를 통해 코드의 재사용성을 높일 수 있고, 부모를 복제한 형태로 가져와 사용할 수 있기에 다시 코딩할 필요도 없습니다. 물론 상속 객체에서 가져온 함수 등을 재정의하여 사용할 수도 있습니다.(이를 Overriding이라고 합니다. 자바에 좀 더 익숙해진 후 배울 예정입니다.)
다형성: OOP의 4가지 특징 중 가장 어려운 내용입니다. 객체가 다양한 형태로 표현될 수 있다는 개념으로, 추상화된 객체와 같이 "틀"을 가진 객체가 구체화된 객체로 표현가능하다 라는 뜻입니다. 매우 어려운 개념으로 아래 그림을 통해 좀 더 자세히 설명하도록 하겠습니다.
설명만으로 이해하기 어려웠던 OOP의 4가지 특징을 그림과 함께 살펴보겠습니다.
위 그림과 같이 "S/W회사" 라는 객체가 있다고 가정해봅시다. 그리고 S/W 회사에는 "회사 A", "회사 B", "회사 C"가 포함되어 있다고 합니다. 이 때 S/W 회사 객체는 "S/W 회사" 라는 종류일 뿐, 실제 회사 개념은 A,B,C에 정의되어 있을 것입니다.
캡슐화: 회사 A, B, C는 각각 다른 업무를 수행할 것이기 때문에 A, B, C는 서로 각 회사 내부에서 어떻게 일을 하는지 알 수 없습니다. 각기 다른 외부 회사의 데이터에 접근할 수 없다고 지정된 상태입니다.
추상화: "S/W 회사" 객체는 특정 분야에 관련된 회사의 한 종류로 만들어진 뼈대입니다.
상속: 회사 A, B, C는 S/W회사 객체를 상속받아 만들어졌습니다. S/W 회사에 필요한 다양한 구성 요소를 복사하여 만들어집니다.
다형성: 회사 A, B, C는 서로 다른 회사이지만 S/W 회사라는 객체라는 공통적인 틀을 가지고 있으며, S/W 회사를 주제로 표현될 수 있습니다.
POP와 OOP의 특징에 대해 알아보았습니다. OOP는 10강 클래스/객체 소개 강의에서 좀 더 자세히 살펴볼 예정이니 지금까지 보신 내용은 앞으로 보게 될 자바의 모습이 이렇구나 정도로 이해하시면 좋겠습니다.
이제까지 자바를 시작하는데 있어서 알아야 할 몇 가지 개념에 대해 짚어보았습니다. 그렇다면 지금부터는 콘솔 출력을 통해 자바 프로그래밍을 시작하겠습니다.
콘솔 출력은 무엇일까요? 콘솔이란 컴퓨터와 소통하는 창을 의미합니다. 사람이 직접 입력한 값, 기능에 따라 계산된 값을 모두 콘솔 창을 통해 확인할 수 있습니다. 프로그래밍 초보자라면 컴퓨터의 생각 구조를 파악하기 쉽지 않아 콘솔에 출력되는 값을 자주 확인하며 이 결과가 왜 그렇게 나왔는지 고민하는 과정을 꼭 거쳐야 합니다.
이제 콘솔 출력 함수를 직접 사용해보겠습니다. 먼저 아래 프로그램을 실행해볼까요?
import java.io.*;
class Main {
public static void main(String[] args) {
System.out.println("제 이름은 [구름] 입니다.");
}
}
여러분이 위에서 실행한 소스코드는 제 이름은 [구름] 입니다.라는 내용을 출력하는 프로그램입니다. 위 소스코드를 하나 하나 자세히 살펴볼까요? 제일 먼저, 소스코드에서 4번째 줄만 가져와 살펴보겠습니다.
System.out.println("제 이름은 [구름] 입니다.");
자바에서 콘솔 출력을 하고 싶다면 System.out.println(" ") 코드의 따옴표 안에 본인이 출력하고 싶은 내용을 입력하여 실행하면 됩니다. 두 줄을 출력하고 싶을 때는 어떻게 할까요? 간단하게 같은 코드를 두 번 사용하면 됩니다. 다음과 같이 말이죠.
import java.io.*;
class Main {
public static void main(String[] args) {
System.out.println("제 이름은 [구름] 입니다.");
System.out.println("제 나이는 [20]살 입니다.");
}
}
출력내용을 살펴보면, 첫번째 줄에 제 이름은 [구름] 입니다.라는 내용이 출력되고, 두번째 줄에 제 나이는 [20]살 입니다.라는 내용이 출력됩니다. 그렇다면 이번에는 4번째 줄을 다음과 같이 수정해봅시다. 'println'을 'print'로 고친 소스코드입니다.
import java.io.*;
class Main {
public static void main(String[] args) {
System.out.print("제 이름은 [구름] 입니다.");
System.out.println("제 나이는 [20]살 입니다.");
}
}
2줄로 출력됐던 내용이 1줄에 모여서 출력되는 것을 확인할 수 있습니다. 출력함수에서 System.out.print 와 System.out.println의 차이점을 이해하셨나요? 'print'에 'ln'이 붙으면 개행(enter)하라는 명령어인 'println'이 됩니다.