객체지향 프로그래밍
실제 세계는 사물(객체) 로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용한다. 즉, 실제 사물의 속성과 기능을 분석하여, 데이터(변수) 와 함수로 정의함으로써 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상세계를 구현하여, 가상세계에서 프로그램을 실행함으로써, 많은 시간과 비용을 절약할 수 있었다.
객체지향언어
- 코드의 재사용성이 높다. : 기존에 작성한 코드를 이용하여, 새로운 코드 작성시 참조가 가능하다.
- 코드의 관리가 용이하다. : 코드간의 관계를 이용하여, 적은 노력으로 코드 변경이 가능하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다. : 제어자와 메서드를 이용하여, 데이터를 보호할 수 있고, 코드의 중복을 제거함으로서 코드의 불일치로 인한 오동작을 방지할 수 있다.
클래스와 객체
클래스 : 객체를 정의해놓은 것, 객체의 설계도 또는 틀, 객체를 생성하는데 사용한다.
객체 : 실제로 존재하는 것 ( 사전적 정의 ) [ = 책, 수학공식, 공기 등 유/무형을 따지지 않는다 ]
프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것.
클래스(설계도) - 객체 (제품) 의 관계라고 볼 수 있다. ( TV를 만들기 위해서는 TV설계도가 필요할 뿐, 설계도는 TV의 기능을 할 수 없다 ! )
즉, 클래스를 정의하고, 클래스를 통해서 객체를 생성한느 이유는 설계도를 통해 제품을 만드는 것. 설계도를 잘 만들어 둔다면, 이후 동일한 제품을 손쉽게 만들 수 있는 것과 같다.
객체와 인스턴스
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 ( Instantiate ) 클래스로부터 만들어진 객체를 해당 클래의스 인스턴스 ( Instance ) 라고 한다.
ex ) TV 클래스로부터 만들어진 객체를 TV 클래스의 인스턴스. TV는 TV클래스의 인스턴스이다.
객체의 구성요소 - 속성과 기능 객체는 속성과 기능, 두가지의 구성요소로 이루어져 있으며, 속성은 멤버변수 ( variable, 특성, 필드, 상태 ) 이고, 기능은 메서드 ( method, 행위, 함수 ) 의 요소이다. 이러한 구성요소를 객체는 여러개를 가질 수 있다.
PracticeClass pClass; // 메모리에 참조변수 pClass 공간 생성
pClass = new PracticeClass(); // 클래스의 (속성과 기능이 포함된) 인스턴스가 메모리에 생성
// 생성된 인스턴스의 주소값은 메모리에 생성되었던, 참조변수 pClass 공간에 저장되고,
// 이를 통해서 pClass 인스턴스에 접근 가능해진다.
// OR
PracticeClass pClass = new PracticeClass(); // 와 같이 생성 가능
String attr = pClass.attribute; // 속성
pClass.getAttribute(); // 기능
프로그래밍 관점의 클래스 변수 > 배열 > 구조체 > 클래스 하나의 데이터를 저장하는 변수(varliable)에서, 같은 종류의 데이터를 집합한 배열(Array)로, 종류와 관계없이, 상관관계가 있는 데이터들의 집합인 구조체(Structure), 그리고 객체지향 언어에서 데이터(변수) 뿐만아니라, 관련 함수 ( Method ) 를 집합한 클래스로 변화되어 왔다. 즉, 관련된 변수와 함수들을 정의한 것이 클래스 이다.
사용자 정의 타입
자바에서 제공하는 기본형 자료형 [ Primitive Type ] (boolean, byte, short int, double, long, float, char ) 가 있고, 이는 수정 불가능한 프로그래밍 제공 자료형이다. 이러한 기본형 자료형 외 참조형 ( String, Integer, Double .. ) 도 존재하고, 이와 같은 참조형 자료형은 사용자 정의에 따라 만들 수 있게 되어있다.
Class HangulNumber{
private String one; // 멤버변수는 외부에서 변경할 수 없게 private 제어자 사용
private String two;
//.. three, four, five, six, seven, eight, nine;
// get, set method 를 통해, 멤버변수 관리를 하는 것이 바람직하다.
public void setOneHangul(String hangulOne){
if(hangulOne != null && !"".equals(hangulOne))
this.one = hangulOne;
}
public String getOneHangul(){
return this.one;
}
//two,three ...
public String getHangulNumbers(int number){
char[] chars = a.toString().toCharArray();
// 수정이 많은 경우 String 보다 StringBuffer, Builder를 사용하는 것이 좋지만
// 예시이므로 패스
String rst = "";
for (char v : chars) {
rst += getNumberToHanul();
}
}
private String getNumberToHangul(int number) {
String result = "";
switch (number) {
case 1:
result = getOneHangul();
break;
//.. 2,3,4,5..
}
return result;
}
}
public static void main(String[] args) {
HangulNumber hn = new HangulNumber();
hn.getOneHangul(); // 일
hn.getHangulNumbers(1234); // 일이삼사
}
// 와 같이 사용자 정의 참조형 타입을 만들 수 있다.
변수와 메서드
변수 : 클래스변수, 인스턴스변수, 지역변수 ( 선언 위치에 따라 ) 멤버변수를 제외한 나버지 변수는 지역변수 , 멤버변수 중 static 이 붙은 것은 클래스 변수, 붙지 않은 변수는 인스턴스 변수
Class Variable{
static int classVariable; // 클래스 변수 -- 클래스가 메모리에 올라갈 때 생성
int intstanceVariable; // 인스턴스 변수 -- 인스턴스가 생성될 때 생성
private void method(){
int localVariable; // 지역변수 -- 변수가 선언되었을 때 생성
}
}
클래스 변수 : 모든 생성된 인스턴스가 공통적인 값을 가져야 하는 경우 사용, 인스턴스를 생성하지 않아도, 사용할 수 있는 변수 인스턴스 변수 : 각각의 인스턴스가 가지는 고유한 값인 경우 사용, 인스턴스를 생성하여야 사용할 수 있다. 지역변수 : 메서드 (블록단위) 수행시, 매서드 내에서만 사용 가능하고, 메서드 종료시 자동 소멸되고, 메서드 내에서 변수 선언시에 생성되어 사용 가능하다.
메서드
개발자가 의도한 프로그래밍한 코드의 집합. 수행에 필요한 값을 전달하여, 원하는 값을 다시 돌려 받는 다던지, 수행 명령을 통해, 수행 완료 여부에 대한 결과만 전달 받을 수 있다. 메서드를 사용하는 이유는, 중복 코드를 방지와 유지보수의 용이성을 위함이다. 자주 사용하는 수행 코드를 하나의 메서드에 작성하고, 호출하여 사용함으로써, 중복된 코드를 방지하고, 수행 코드 수정이 필요한 경우, 메서드에서 한번의 수정으로 해당 수행코드에 대한 유지보수가 편리해진다.
JVM의 메모리구조
JVM 은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당 받고, 용도에 따라서 영역을 나누어 관리를 한다.
메서드 영역 ( Method Area )
> 프로그램 실행 중 (어떤) 클래스가 사용되면, JVM 은 해당 클래스의 *.class 파일을 읽어서 분석하여, 클래스 데이터를 이곳에 저장. 클래스변수(Class Variable)도 이 영역에 함께 생성.
힙 ( Heap )
> 인스턴스가 생성되는 공간, 프로그램 실행 중 생성되는 인스턴스는 전부 이곳에서 생성, 인스턴스 변수( Instance variable) 가 생성되는 공간
호출스택 ( call stack or execution stack )
> 메서드의 작업에 필요한 메모리 공간을 제공. 메서드 호출시, 호출스택에 호출된 메서드를 위한 메모리가 할당되고, 이 메모리는 메서드가 작업을 수행한느 동안, 지역변수(매개변수 포함) 들과 연산의 중간결과 등을 저장하는데 사용된다. 메서드가 작업을 마치면, 할당된 메모리공간은 반환되어 비어진다. 호출 스택은 Stack 의 자료구조를 가지고있다. 호출된 메서드의 순서대로 스택이 쌓여지고, 현재 실행 중인 메서드는 가장 위의 스택 데이터이다. 메서드 실행 중, 메서드 내부에서 다른 메서드 호출시, 실행 중인 메서드는 정지되고, 호출한 메서드를 호출한 메서드 위에 쌓고, 해당 메서드를 실행한다. 호출한 메서드가 종료되면, 해당 메서드가 존재한 메모리는 반환되고, 아래의 메서드를 실행한다. 가장 먼저 호출(가장아래의)된 메서드가 종료되면, 메모리를 반환되고, 메모리 공간이 비게 된다.