자바 클래스(class)
목차
클래스부터는 객체 지향 프로그래밍의 문법입니다. 클래스 사용법을 익히기 전에 먼저 객체 지향 프로그래밍(Object Oriented Programming)에 대하여 알아보겠습니다.
객체(object)
객체라는 단어부터 잘 와닿지가 않습니다. 객체의 뜻은 어떤 대상, 사람이나 사물을 말합니다. 눈에 보이는 모든 것들과 보이지 않은 것들도 모두 객체입니다.
굉장히 범위가 넓습니다. 모든 것이 객체다. 라는 말도 자주 씁니다. 이럴 때는 한정적인 케이스를 알아보는게 좋습니다.
예를 들어 TV는 객체입니다. TV객체에는 고유의 속성이 있을테고 행동이 있을 것 입니다. 여기서 TV의 속성을 클래스의 속성이라고 하고 행동을 메소드라고 합니다.
TV에 채널이 12개 있다. 그러면 1부터 12까지의 채널이 TV의 속성이라고 볼 수 있습니다. 메소드는 이 속성들에 적용할 수 있는 행동을 말합니다. 리모콘을 눌러 파워를 키고 채널을 5번으로 돌렸습니다. 채널을 돌리는 행동은 TV에 할 수 있는 행동입니다. 전자레인지의 채널은 돌리거나 하지 않습니다.
객체의 속성과 메소드는 상당히 긴밀하게 연결되어 있습니다 이런 식으로 객체를 만들면 실생활의 문제에 대하여 직관적으로 설계하여 프로그래밍에 구현할 수 있습니다. 특히 자바 언어는 객체지향 프로그래밍의 전통을 이어가고 있습니다.
클래스(class)
그래서 클래스는 객체를 컴퓨터 프로그램으로 설계해 놓은 것 입니다. 객체라는 사물은 광범위하고 관념적이므로 그 모든 내용을 컴퓨터 코드로 만들 수는 없습니다. 중요한 속성과 메소드만 구현하는 것입니다.
사실 자바를 시작해온 순간부터 클래스를 사용하고 있었습니다.
public class Main { public static void main(String[] args) { System.out.println("Hello"); } }
public class Main 이 그동안 사용해오던 클래스입니다. public static void main()함수는 좀 특별한 메소드긴 하지만 이것도 메소드입니다.
계산기 클래스 예제
자바는 100% 객체지향 프로그래밍을 지향하기 때문에 시작점도 이미 클래스입니다.
별도의 클래스를 만들어 보겠습니다. 쉬운 예제로 접근하면 좋은데요.
사칙연산이 가능한 계산기를 만들어 보겠습니다.
class Calculator { int result; public void add(int a, int b){ result = a + b; } public void sub(int a, int b){ result = a - b; } public void mul(int a, int b){ result = a * b; } public void div(int a, int b){ if(b != 0) { result = a / b; } else{ result = 0; } } }
실생활에 있는 계산기를 객체로 만든다고 생각하면 됩니다. 단 자바의 경우 정적 타이핑 언어기 때문에 형변환이라던가 조금 더 신경쓸 부분이 많습니다. 그런 부분은 차후에 알아가기로 하고 지금은 클래스가 무엇인가 집중합니다.
계산기의 결과값을 result 라는 변수에 저장하게 해놨습니다. result가 곧 내부 속성입니다. 함수형 프로그래밍을 할 때는 return 으로 호출한 곳으로 돌려주지만 계산기는 자신의 데이터를 가지고 있으므로 당장 돌려주지 않아도 됩니다. 멤버변수에 가지고 있으면 됩니다.
이를 사용하는 방식도 다릅니다.
클래스 사용의 기본은 인스턴스를 만들어서 사용합니다. 인스턴스(instance)란 또 뭐냐 용어가 많이 나옵니다. 쉽게 말해 클래스가 설계도라면 인스턴스는 제품입니다.
실제 세계의 객체 아이디어를 가져와서 클래스라는 설계도를 만들고 그 설계도를 가지고 메모리에서 실제 작동하는 제품이 인스턴스(instance)입니다. 좀 한번에 이해가 안가도 정상입니다. 좀 시간이 걸립니다.
그래서 인스턴스를 만들면 하나의 메모리 공간을 할당 받습니다. 멤버변수을 보유하는 메모리 공간 뿐 아니라 메소드(특정 규칙을 가진 함수) 역시 사용할 수 있습니다.
public class Main { public static void main(String[] args) { Calculator myCal = new Calculator(); myCal.add(10, 20); System.out.println("add: "+ myCal.result); myCal.sub(30, 14); System.out.println("sub: "+ myCal.result); myCal.mul(3, 9); System.out.println("mul: "+ myCal.result); myCal.div(10, 0); System.out.println("div: "+ myCal.result); } }
add: 30 sub: 16 mul: 27 div: 0
위 코드에서는 result 라는 공간에 사칙연산의 결과값을 돌려가면서 저장한다는 것을 볼 수 있습니다. 보통의 계산기가 결과값을 하나 저장하기 때문에(+M을 제외하면) 프로그램에도 하나만 넣었습니다.
클래스를 만들기 위해서 class 키워드를 사용합니다.
접근제어자 class 클래스이름 { 멤버변수; 메소드; }
접근제어자는 public 같은 키워드를 말합니다. 클래스도 사용가능한 범위를 조절할 수 있습니다.
클래스 안에서 멤버변수나 메소드에도 각각 접근제어자를 붙일 수 있는데요. 이런 외부와의 인터페이스를 설계하는 것도 객체 지향 프로그래밍의 방식입니다.
함수를 중심으로 하는 절차지향형 프로그래밍과는 많이 다르죠. 프로그램이 작동되는 것 뿐만 아니라 객체간에 어떠한 관계를 맺고 있는지도 생각하면서 프로그래밍해야 합니다.
패키지(Package)
패키지는 클래스 파일의 묶음입니다. 프로그래밍을 하다보면 클래스를 한개만 사용하는게 아니라 여러개의 클래스가 계층구조를 가지고 사용하게 됩니다.
라이브러리도 마찬가지고요. 인텔리제이나 이클립스에서 새로운 프로젝트를 만들때 패키지도 만드는데 패키지 자체가 디렉토리 계층을 이루고 있습니다.
패키지가 복잡해 보이지만 이게 없다면 같은 이름의 클래스들간에 구분이 어려워집니다. 외부라이브러리를 사용할 때도 겹칠 수 있는데요.
라이브러리도 import 문으로 사용합니다. . 도트가 바로 디렉터리 계층구조입니다.
import java.time.*; System.out.println(LocalDateTime.now());
패키지의 사용법도 비슷합니다. 여기서는 Project 폴더가 Hello 인데 폴더로 따지면 Hello >> com 입니다.
package com; com.Calculator newCal = new com.Calculator();
패키지는 클래스들이 계층구조를 이루고 있다. 정도는 알아둘 필요가 있습니다.
요약
이제 객체 지향 프로그래밍의 먼길을 떠날 시간입니다. 객체 지향 프로그래밍은 개념이라서 완전한 마스터가 없습니다.
한가지 팁은 너무 성급하게 생각하지 말라는 부분입니다. 객체, 클래스, 인스턴스 등 추상적 개념들이 많아서 어떤면에서는 C언어보다 어려움이 있습니다.
외부참조문서
자바 클래스(The Java™ Tutorials > Classes and Objects)