ToyProblem ¶
~cpp public class factorial { public int process(int number) { if(number!=1) return number*process(number-1); else return 1; } public void main() { System.out.println(process(7)); } }
- 원래 RandomWork 짜던게 있는데 eclipse가 Run이 안되더군요;
그래서 디버그 및 결과 확인불가.;
Run쪽 옵션이 틀린건가;; 오류가 아니라 메인 클래스가 없다는 등의 다양한 메시지가 뜨면서 안돼요; 결국 간단한 소스를 올립니다
객체지향 개념 ¶
객체란? ¶
- 세계에 존재하는 것들, ex) 사람, 자동차, 컴퓨터 등..
다음의 두 가지로 나눌 수 있다.
- 상태(state) : 객체가 가지고 있는 속성 또는 특성
- 행동(behavior) : 객체가 가지고 있는 기능 또는 할 수 있는 행동
ex) 자동차 - 색, 바퀴, 손잡이, 현재 기어위치 등의 상태에,
달린다, 멈춘다, 속도를 높이거나 낮춘다 등의 행동을 한다
이러한 실세계를 소프트웨어적으로 표현하기 위한 방법중 하나가 '객체지향'이다.
- 객체의 상태와 행동 -> 소프트웨어 객체의 변수와 메소드
로 모델링한다.
즉, 상태를 나타내는 변수와 그 상태를 변경하는 행동의 메소드로
실세계의 객체를 소프트웨어 객체로 모델링하고 구현한다.
객체지향 방법에서 나타나는 몇 가지 특징 <- OOP의 특징 ¶
- 캡슐화 : 변수(상태)와 메소드(행동)를 하나의 묶음으로 캡슐화한다.
이것으로 인해 모듈성과 정보은닉이라는 이득을 얻는데,,
하나의 객체의 소스가 다른 소스와 무관하게 유지할 수 있고, 또 public이나 private 권한을 통해 정보에 대한 접근 정도를 설정할 수 있다.
- 메시지 : 객체는 다른 객체에 메시지를 보내서 통신할 수 있다.
각 메시지는 메시지를 받을 객체, 수행을 요청한 메소드의 이름과 그 메소드에 필요한 매개변수의 세 가지 구성요소를 갖는다.
- 클래스 : 특정한 종류의 모든 객체들에 적용할 수 있는 변수와 메소드를 정의하는 '소프트웨어적인 설계도' 이다.
실세계의 객체들의 상태와 행동들을 소프트웨어적으로 추상화해 놓은 것이다.
청사진이라고 하기도 하고, 벽돌을 찍기 위한 하나의 틀에 비유하기도 한다.
- 인스턴스 : 클래스에 대한 변수를 선언하는 것을 '인스턴스를 생성한다'고 하고, 이 변수를 인스턴스라 한다.
인스턴스를 생성하는 것은 벽돌틀로 벽돌을 찍는다고 할 수있다.
- 객체 : 실세계에 적용 - 자동차(클래스) -> 아반테, 누비라, 그랜저, 티고 등 (객체)
- 상속 : 자동차 클래스에 버스 클래스, 트럭 클래스, 자가용 클래스가 속한다면,
자동차 클래스는 상위 클래스, 버스,트럭,자가용 클래스를 하위클래스라 하며, 이들의 관계에서 "하위클래스는 상위클래스를 상속한다"고 한다.
- 다형성 : 같은 이름을 같는 여러 가지 형태가 존재한다는 것
자바에 메소드(함수) 다중정의, 매소드 재정의가 있다.
클래스 정의 및 인스턴스(객체) 생성 ¶
자바 언어는 객체지향 프로그래밍을 할 수 있도록 문법을 제공해 준다.
- 클래스 정의
~cpp class 클래스이름 { // 변수 선언부 … // 메소드 선언부 … }
- 인스턴스 생성
~cpp 클래스이름 클래스인스턴스이름 = new 클래스이름(); 또는 클래스이름 클래스인스턴스이름; 클래스인스턴스이름 = new 클래스이름();
변수 및 메소드의 접근제어 ¶
- public - 같은 클래스, 하위클래스 등 같은 패키지의 모든 클래스에서 접근가능
- private - 같은클래스 내에서만 접근가능
- protected - 같은 클래스, 하위클래스 등 같은 패키지의 모든 클래스에서 접근가능
- 생략 : 같은 클래스 또는 같은 패키지의 모든 클래스에서 접근가능, 하위클래스에서 접근 불가능
메소드의 다중 정의 ¶
- 같은 이름으로 여러 일을 하는 것
- 자바에서는 함수 다중 정의만을 제공함
객체 생성자와 객체 생성 과정 ¶
객체 생성자 ¶
자바 언어를 이용하여 객체를 생성하고 필요에 따라 값을 초기화 해 주어야 하는 경우
객체 생성자는 new 연산자를 이용하여 객체를 생성할 때도 호출된다.
객체 생성자는 new 연산자를 이용하여 객체를 생성할 때도 호출된다.
- 객체가 생성될 때 자동호출, 객체의 변수초기화, 메모리 할당들의 작업을 함
- new 연산자로 객체를 생성할때 호출, 메모리를 할당하고 객체 생성자 호출
~cpp 클래스이름(형식매개변수 리스트) { … } 클래스이름(형식매개변수 리스트) { 다른 객체 생성자 호출; ß 반드시 첫번째 줄에서 이루어져야 함. … } 클래스이름 변수이름 = new 클래스이름(실매개변수 리스트);
===this===
* 자기 자신을 나타냄
* 메소드 내에서 변수와 객체의 이름이 같을 경우 변수 앞에 this를 붙임
* 객체생성자 내에서 다른 생성자 호출
* 메소드 내에서 변수와 객체의 이름이 같을 경우 변수 앞에 this를 붙임
* 객체생성자 내에서 다른 생성자 호출
~cpp this this.멤버변수 this(매개변수);
클랙스멤버와 인스턴스 멤버 ¶
클래스 멤버는 변수와 메소드가 있고,
이는 인스턴스 변수와 인스턴스 메소드 및 클래스 변수와 클래스 메소드로 나뉜다.
이는 인스턴스 변수와 인스턴스 메소드 및 클래스 변수와 클래스 메소드로 나뉜다.
~cpp 클래스 변수와 클래스 메소드의 선언) [접근권한] static 변수 선언; [접근권한] static 메소드 선언; 클래스 변수와 클래스 메소드의 접근) 클래스이름.클래스메소드() 클래스메소드() 객체참조값.클래스메소드()
클래스 초기화 및 객체의 생성 과정 ¶
클래스를 처음으로 메모리에 적재
클래스 초기화
클래스 실행
상속 ¶
상속, 상위클래스, 하위클래스 ¶
위에 있음
상속과 생성자 및 생성 과정 ¶
- this : 클래스 내의 객체 생성자에서 다른 객체 생성자를 호출
- super : 하위클래스의 객체 생성자에서 상위클래스의 객체 생성자를 호출
- 객체 생성순서
- new 생성자를 이용하여 객체를 위한 메모리 공간을 할당
- 모든 인스턴스 변수를 0, '\u0000', false, 그리고 null 등과 같은 디폴트 초기치로 초기화
- 상위클래스의 생성자를 호출
- 하위클래스에 선언된 인스턴스 변수 초기자 수식 및 인스턴스 초기화 블록을 실행
- 하위클래스의 생성자 몸체를 실행
상속과 인스턴스 메소드의 재정의(Overriding) ¶
기본적으로 하위클래스는 상위클래스로부터 상속되는 상태와 행동들을 가진다.
또한, 하위클래스는 자신에게 필요한 변수들과 메소드를 추가적으로 정의할 수 있습니다. 그리고, 하위클래스는 상위클래스에서 정의된 메소드와 같은 이름, 같은 인자들을 갖는 새로운 메소드를 정의하여 상위클래스에서 상속되는 메소드를 재정의할 수 잇는데,
여기서 몇가지 지켜야 할 것이 있다.
- 인스턴스 메소드이어야 한다.
- 메소드의 이름이 같아야 한다.
- 매개변수의 개수가 같아야 한다.
- 매개변수 각각의 자료형이 일치해야 한다.
- 메소드의 리턴형이 일치해야 한다.
상속과 변수 및 메소드의 접근제어 ¶
- 인스턴스 변수, 클래스 변수, 그리고 클래스 메소드는 은닉될 수는 있어도 재정의 될 수는 없다.
- private 접근지정자로 선언된 변수는 상속할 수 없고, 메소드는 상속 및 재정의 할 수 없다.
- public 또는 protected 접근 지정자로 선언된 변수와 메소드는 상속할 수 있고, 메소드에 대해 재정의 할 수 있다.
...
...