Java

[Java]Class - part.1

MoZZANG 2022. 3. 4. 20:45

Java, JavaScript, C++, C#과 같은 언어들은 객체지향 프로그래밍언어라고 한다.

 

객체지향 프로그래밍(OOP : Object Oriented Programming)이란?

 : 인간의 현실세계를 정보화 시스템으로 반영하기 위해 모든 개념(사물, 현상, 사건)등을 객체화 시켜 프로그램에 반영하는 것.

 

여기서 말하는 객체(Object)란 유무형의 물체, 현상, 사건 등을 의미한다. 쉽게 말해 자동차, 컴퓨터, 사람 등등이 바로 객체이다. 이러한 객체는 행동과 속성(성질or상태)를 가지고 있다.

 

사람은 이름,키,몸무게,혈액형 등의 속성(성질or상태)를 가지고 있고 밥을 먹는다, 잔다, 운동한다 등과 같은 행동이 있다.

자동차는 브랜드, 차종, 엔진 등의 속성(성질or상태)를 가지고 있고 주행한다, 정지한다 등과 같은 행동이 있다.

 

따라서 객체란 우리 주변의 거의 모든 것을 포괄하는 것이라 생각하면 쉽다.

 

이러한 객체를 프로그램으로 만들 때는 객체가 가지는 속성은 변수로, 행위는 메소드로 구성한다. 이를 객체 모델링이라 한다. 즉 모델링은 어떤 객체의 행동이나 속성을 뽑아내는 것이다.

 

 

이런 객체 형태로 만드는 것을 지향하는 프로그래밍이 객체지향 프로그래밍인데 크게 4가지의 순서로 나뉠 수 있다.

 

1. 프로그램에 필요한 객체를 뽑아냄

2. 객체 모델링

3. 클래스 구성(=설계도를 만듦)

4. 객체 생성(=실물로 만듦 =프로그램으로 만듦) 및 사용

 

여기서 클래스를 만드는 것을 쉽게말해 '추상화한다' 라고 하며 한 물체를 대표하는 속성과 행위를 추출해내는 것을 프로그래밍에서는 추상화라고 하는 것이다.

 

우리가 변수는 하나의 값만을 저장할 수 있고, 배열은 같은 타입의 값만을 여러개 저장할 수 있다면 

클래스는 여러 타입의 값을 여러개 저장할 수 있는 내가만든 자료형이다. 또 클래스는 객체의 설계도이다.

자동차(=객체)를 만들 때도 설계도(=클래스)가 필요하듯이 프로그램을 만들때도 설계도(=클래스)가 필요하며

이런 클래스(=설계도)를 가지고 프로그램을 만들고 그것을 실행하는 것(=객체)은 맥락이 같다고 할 수 있다.

 

 

 

자 이제 클래스를 본격적으로 시작해보자

 

클래스의 기본구조는 다음과 같다.

▲ 접근지정자와 modifier는 나중 포스팅에서 살펴볼 것이니 신경쓰지말고 즉 class + 클래스명으로 시작해서 중괄호 안에 원하는 속성을 변수나 상수로, 원하는 동작을 메서드로 넣어주거나 클래스 안에 또 클래스를 넣는 등의 구조를 가지고 있다.

 

여기서 맴버 ~ 라는 단어가 붙은 것은 '그 class의 맴버다' 라는 의미이다.

 

 

<맴버 변수 >

 

맴버변수는 해당 클래스와 has a 관계가 존재해야 한다. 즉 그 클래스와 관련없는 생뚱맞은 속성으로 하면 안된다는 것이다. 예를 들어 Class Person 이라는 클래스에 맴버 변수로 String wheel 이 오면 안된다는 것이다. 사람한테는 바퀴라는 것이 존재하지 않으니까 말이다.

 

또한 맴버변수는 초기화를 하지 않으면 배열과 마찬가지로 해당 자료형으로 초기화가 된다.

Ex.)참조형 : null, int : 0, double : 0.0, boolean : false 등

 

그리고 맴버변수는 해당 클래스안의 모든 메소드에서 사용이 가능하다.

 

맴버변수는 모든 데이터 타입을 사용할 수 있다는 특징도 있는데 기본데이터형, 배열, 클래스 등 가리지 않고 사용가능하다.

 

 

 

자 이제 사람을 추상화해보자 즉, 사람의 설계도를 만들어보자 즉, 사람의 행동과 속성을 뽑아내서 행동은 메소드로 속성은 상수나 맴버변수로 만들어보자!

▲ 사람이 가지고 있는 몇가지 특성(속성)을 맴버변수로 만들어 보았다. 맴버변수는 모든 자료형으로 가능하다.

 

 

 

 

 

<맴버 메소드 >

▲ 사람이 하는 행동들을 맴버 메소드로도 만들어 보았다. getPerson이나 printPerson은 실제 사람이 하는 행동은 아니지만 클래스 공부를위해서 추가하였다.

 

 

 

 

이 모든 것이 하나의 Person이라는 클래스를 구성하고 있는 맴버변수와 맴버메소드이다. 우리는 이 클래스 Person을 Person.java로 하나의 객체로 만들어서 저장하자.

 

 

 

 

 

이제 만든 이 클래스를 사용해보려고 한다. 그러기 위해서는 클래스의 객체를 생성하여야 한다.

 

▲ 우리가 배열을 메모리할당 할 때처럼 new연산자를 이용해서 heap영역에 클래스명 타입의 메모리를 만든다.

    그렇게 만든 객체에 접근해서 맴버변수나 맴버메소드 등을 사용하기 위해서는 ' . ' 을 이용한다.

 

또 다른 java파일을 만들고 이곳에서 클래스 Person의 기능을 사용해보자.

 

1) 인스턴스 변수 선언

▲ 클래스는 자료형(Data type)처럼 사용할 수 있으므로 Person이라는 자료형의 person1이라는 변수를 선언했다.

 

 

 

 

2) 메모리를 heap영역에 생성(=인스턴스화=객체화)

▲ new연산자를 이용하여 heap영역에 메모리를 만들었다. Person형의 메모리이므로 곧 Class형, 즉, 참조형의 메모리이다. 이제 heap영역에 생긴 Person형의 메모리 안에는 class Person의 맴버변수와 맴버메소드들의 메모리가 포함되어 있다.

 

 

▲ 이제 메모리할당 즉, 객체화 즉,인스턴스화까지 했으니 잘 생성되었는지 주소도 한번 찍어보고 class Person이 가지고 있는 printPerson메소드도 사용해보자. 여기서 person1이 class Person의 맴버변수나 맴버메소드 등을 사용할 수 있는 이유는 person1을 선언할 때 자료형을 Person으로 했기 때문에 class Person의 기능을 상속받았기 때문이다. class는 자료형이기 때문이다!

 

▲ stack영역에 있는 person1메모리가 참조하고 있는 heap영역의 Person형 메모리의 주소이다.

   또한 class Person에 소속되어 있는 맴버 메소드 printPerson를 호출했을 때의 결과도 잘 출력되었다.

   여기서 printPerson호출 시 출력값에 null과 0.0이 있는 것은 자동초기화 되었으며 우리가 아직 초기화를 해주지 않았기 때문이다.

 

 

 

 

3) 맴버 변수 초기화

▲ 이제는 자동초기화된 값이아닌 우리가 원하는 값으로 초기화를 해주자. 이후 다시한번 상속받은 Person 클래스의 기능인 메소드들을 사용해보자.

 

▲ 자동초기화 시에는 null의 정보와 나이는 1, 몸무게는 0.0으로 설정되어 출력되었었지만 우리가 직접 초기화 후에는 입력한 값으로 맴버 메소드를 잘 사용되는 모습을 볼 수 있다.

 

 

 

 

또 다른 변수 하나를 만들어서 이번에는 인스턴스변수 선언과 동시에 메모리를 할당하고 초기화까지 해보자.

▲ 인스턴스 변수선언으로 stack영역에 person1과는 다른 perosn2라는 메모리가 생성되었으며 heap영역에 Person형 메모리가 생성되어 person2는 heap영역의 메모리의 주소값을 저장한다.

바로 변수를 초기화 한 후 Person 클래스의 맴버메소드들을 사용해보았다.

▲ person2가 참조하고 있는 heap영역의 Person형 메모리의 데이터 값

 

 

만약 여기서 person2를 다시 new연산자를 통해서 메모리를 할당하면 어떻게 될까?

▲ 새로 메모리를 할당했다.

▲ 결과는 위와 같이 초기화값으로 출력된다.

왜냐하면 처음에 person2를 선언하면서 동시에 메모리할당 했을 당시에 참조했던 메모리가 아닌 새로 생긴 메모리의 주소값을 참조하게 되버리기 때문에 기존에 참조하고 있던 메모리와는 연결에 끊어지게 되기 때문에 그런 것이다.

 

 

*Java에서는 new로 새롭게 할당한 메모리를 해제할 필요가 없다. GC(Garbage Collector)가 돌아다니다가 더 이상 사용되지 않는 메모리(Unreachable Object : stack에서 참조가 끊긴 객체)는 알아서 해제해준다.

'Java' 카테고리의 다른 글

[Java]Class - part.3  (0) 2022.03.05
[Java]Class - part.2  (0) 2022.03.04
[Java]method없이 가위바위보게임 만들기  (0) 2022.03.04
[Java]Call By Value & Call By Reference  (0) 2022.03.03
[Java]method - type4  (0) 2022.03.03