Java/Java 기본

클래스 선언과 활용

검정비니 2018. 6. 22. 01:02
728x90
반응형

클래스 선언과 활용



1. 클래스와 객체


객체 지향 프로그래밍에서는 실제 세상의 물체들을 객체로 모델링한다고 하였다. 그렇다면 클래스는 객체와 어떻게 다른가? 클래스는 객체를 만들기 위한 설계도라고 보면 된다. 즉, 객체 지향 프로그래밍은 인터넷 세계 상에 자판기나 달력, 전화기등 어떠한 일을 하기 위해서 우리를 도와주는 객체를 만들고, 그 객체를 사용해서 주어진 임무를 완수하는 방식이라고 보면 된다. 이때, 이 객체들을 만들기 위해서는 설계도가 필요할 것이다. 예를 들어, 볼펜의 설계도를 통해서 철수와 영희에게 각각 볼펜을 만들어 준다고 생각해 보자. 같은 설계도를 통해서 만들어졌으니 두 볼펜의 종류는 같겠지만, 철수의 볼펜과 영희의 볼펜은 같은 볼펜이 아니다. 두 볼펜은 엄연하게 다른 객체이다. 그렇지만, 같은 설계도에 의해서 만들어졌기 때문에 같은 타입의 객체라고 할 수 있다. 여기서 볼펜의 설계도가 클래스, 만들어진 볼펜들이 객체들이라고 보면 이해가 쉬워진다.


클래스는 객체들이 어떤 특성을 갖는다고 정의만 할 뿐 값을 가질 수는 없다. 클래스는 객체의 행동에 대한 절차나 방법을 정의할 뿐 실제 행동을 하지 않는다. 앞서 말했듯이 클래스는 객체를 생성하기 위한 설계도 또는 틀이라고 볼 수 있고, 객체는 설계도 또는 틀로 찍어낸 실체라고 볼 수 있다. 이러한 이유로 객체를 클래스의 인스턴스(instance)라고 부르며 객체와 인스턴스 두 용어를 구별 없이 사용한다. (정확하게 말하자면, object란 객체 지향 프로그래밍에서 사용하는 학술적인 용어이며, 실제로 프로그램이 구동하면서 만든 객체를 이르는 용어가 instance이다. 하지만, 실제로는 두 용어를 구별하지 않고 자유롭게 사용하는 개발자들이 많기 때문에 굳이 두 용어를 차별시키려 할 필요는 없다.)


- 클래스의 특성:

1) 클래스는 고유한 이름을 가진다.

2) 클래스는 속성을 가진다. -> 상태 변수, 멤버 변수, 멤버 데이터 등

3) 클래스는 잘 정의된 행위를 가진다. -> 메소드나 멤버 함수 등





2. 클래스의 구성



자바에서 클래스를 선언할 때 class 키워드를 사용한다. 자바 클래스의 구문은 다음과 같다.


접근_권한 class 클래스명 {

필드, 생성자, 혹은 메소드 등..

}


이제 자바에서 클래스를 구성하는 요소들에 대해서 알아 보도록 하자.



1) 클래스 접근 권한 (public, package private (= default), private)


접근 권한을 나타내기 위해서, 클래스를 선언할 때에는 가장 먼저 클래스의 접근 지정자를 선언한다. 접근 지정자가 public이라면 어느 클래스에서든 해당 클래스에 대해 사용 혹은 접근이 가능함을 뜻한다. 접근 지정자를 따로 선언하지 않을 경우, package private으로 접근 권한이 설정되어진다. 이는 다시 말해서, 해당 클래스와 같은 패키지 내에 있는 클래스 만이 이 클래스에 대해 사용 혹은 접근이 가능하게 된다. 마지막으로, 접근 권한이 private으로 되어 있을 경우, 해당 클래스 자신 혹은 그 클래스를 포함하고 있는 클래스만이 해당 클래스에 접근이 가능하다. 이 클래스의 접근 권한을 private으로 세팅하는 것은 내부 클래스(Inner class)를 만들 때에 주로 사용하는 패턴이다.



2) 클래스 명


class 키워드 이후에 클래스의 이름을 정의한다. 클래스는 "{"로 시작하여 "}"로 닫으며, 이곳에 모든 멤버 필드와 메소드를 구현한다.



3) 필드 (field)


값을 저장할 멤버 변수를 선언한다. 멤버 변수 혹은 필드라고 부른다. 필드 앞에 붙은 접근 지정자에 따라 해당 필드의 접근 권한의 범위가 정해진다. (필드에 지정할 수 있는 접근 지정자는 public, private, package private, protected의 총 4 종류이다.)



4) 생성자 (constructor)


클래스의 이름과 동일한 메소드를 생성자(constructor)라고 부른다. 생성자는 이후에 더 자세히 설명을 하겠지만, 이 클래스의 객체가 생성될 때만 호출되는 메소드이다. 생성자 역시 접근 지정자를 통해서 접근 권한을 지정할 수 있다.



5) 메소드 (method)


메소드는 실행 가능한 함수이며, 객체의 행위를 구현한다. 메소드 역시 접근 지정자를 통해서 접근 권한을 지정할 수 있다.





3. 객체 생성과 레퍼런스 변수



레퍼런스 변수와 객체의 생성에 대해서 쉽게 이해하기 위해서 예시 코드를 이용해 보도록 하자.



public class Person {

int age;

private String name;


public String getName() {

return name;

}


public Person(String name) {

this.name = name; //this 키워드는 필드와 매개변수의 이름이 같을 경우에, 혼란이 생기지 않도록 멤버 변수를 나타내주는 역할을 한다.

}


public static void main(String[] args) {

Person p = new Person("A");

p.age = 30;

System.out.println(p.getName()+ " is " + p.age + " years old.");

}

}


위의 코드의 메인 메소드를 살펴보고 어떤 일이 일어나는지를 알아보도록 하자.


우선, Person 타입의 p라는 레퍼런스 변수를 선언하였다. 그리고 같은 문장에서 그 레퍼런스 변수에 새로 만든 Person 타입 객체를 연결시켰다. 이 객체는 "A"라는 문자열을 매개변수로 받는데, 이는 Person 클래스의 생성자가 문자열 하나를 매개변수로 받아서 그 값을 name 이라는 문자열 멤버에 저장하기 때문이다. 이렇게 레퍼런스 변수의 선언과 객체의 생성이 완료되면 다음 문장으로 넘어가게 된다.


두번째 문장을 보게 되면, 멤버 변수의 이름을 이용해서 객체의 필드에 접근을 한 후에, 그 필드에 값을 지정해주고 있다. 이제, 이 p라는 레퍼런스 변수가 가리키는 객체는 age 필드에 30이라는 값을, 그리고 name 이라는 필드에는 "A"라는 문자열을 저장하고 있게 되었다.


세번째 문장을 보게 되면, 주어진 문자열을 출력하게 된다. 이 문자열은 Person 클래스의 getName() 메소드가 반환하는 값, 즉 name 필드의 값과 age 필드의 값을 이용해서 만들어진다. 문자열 "A is 30 years old." 라는 문장이 출력되고 나면 이 프로그램은 종료되게 된다.



- 레퍼런스 변수의 선언


레퍼런스 변수를 선언만 한다고 해서 그 레퍼런스 변수가 객체가 되는 것은 아니다. 객체를 만든 후에, 그 객체를 참조하도록 만들어 줄때 비로소 레퍼런스 변수를 객체로 취급할 수 있게 된다. C++와는 달리 자바에서는 레퍼런스 변수의 선언과 객체의 생성은 별개의 것이다.



- 객체 생성 -> new 연산자 이용


자바에서는 반드시 new 연산자를 사용하여 다음과 같이 객체를 생성하여야 한다.

p = new Person("A");

new 연산자를 사용하게 되면 우선, 자바 가상 기계가 객체를 만들 메모리 공간을 확보하게 된다. 그 다음에는, new 연산자 다음에 있는 생성자를 통해서 객체를 생성하게 된다.




+a) 객체 맴버 접근


객체의 멤버에 접근할 때는 다음과 같이 점(.) 연산자를 붙인다.

객체_레퍼런스.멤버


i.e.

p.age = 30;

int i = p.age;

String s = p.getName(); // 메소드 접근 역시 멤버 접근과 마찬가지로 점 연산자를 사용한다.

반응형

'Java > Java 기본' 카테고리의 다른 글

메소드 형식  (0) 2018.06.22
객체 배열  (0) 2018.06.22
객체 지향과 자바  (0) 2018.06.21
예외 (Exception)  (0) 2018.06.21
main() 메소드의 인자  (0) 2018.06.13