Chapter 1. 객체 지향 프로그래밍 I
1. 객체 지향 언어
- C언어와 같은 절차 지향 언어에 몇가지 규칙을 추가해 보다 발전된 형태의 언어
- 객체(Object)라는 독립된 단위를 이용해 Code간에 서로 관계를 맺어 줌으로써 보다 유기적인 Program을 구성할 수 있도록 구성된 언어
- 객체 지향 언어의 주요특징
· Code의 재사용성 향상
· Code 관리 용이
· 신뢰성이 높은 Programing을 가능하게 함
2. Class And Object
- Class
· 객체(Object)를 정의 해 놓은 것
· 객체를 생성하는데 사용된다.
- 객체(Object)
· 사물 또는 개념과 같이 실제로 존재하는 것
· 객체가 가지고 있는 기능과 속성에 따라 용도가 정해진다.
- Object And Instance
· 인스턴스화(Instantiate)
◦ Class로부터 객체를 만드는 과정
◦ Instance
▹ Class로부터 만들어진 객체
- 객체의 구성 요소
· 일반적으로 객체는 속성들과 기능들을 갖으며 객체가 가지고 있는 속성과 가능을 해당 객체의 Member라고 한다.
· 속성(Property)
◦ 멤버변수(Member Variable) → 주로 사용
◦ 특성(Attribute)
◦ 필드(Field)
◦ 상태(State)
· 기능(Function)
◦ 메서드(Method) → 주로 사용
◦ 행위(Behavior)
◦ 함수(Function)
- Instance Create and Use
· Instance Create and Initialize
1 2 | [Class Name] [Variable Name]; [Variable Name] = new [Class Name](); | cs |
◦ Example
1 2 | CLA Vari; Vari = new CLA(); | cs |
▹ Instance를 생성하기 위해서는 사용하고자하는 변수 선언과 동일하게 Instance의 Class의 이름을 Instance 속성으로 사용하고 Instance 이름을 임의로 지정한다.
▹ Instance의 초기화는 변수 초기화와 같은 방법으로 ‘[변수] = new [Class]()’를 사용한다.
· Member Variable and Instance Use
1 2 3 | [Variable Name].[Member Variable]; [Variable Name].[Member Method](); [Method](“[String]” + [Variable Name].[Member Variable] +“[String]”); | cs |
◦ Example
1 2 3 | Vari.MemberVari; Vari.MemberMeth(); System.out.println(“String1” + Vari.MemberVari + “String2”); | cs |
▹ Instance의 멤버 변수에 접근하기 위해서는 Pointer를 이용하기 위해 ‘.’을 사용해 ‘[Variable Name].[Member Variable];’과 같이 작성해 접근한다.
▹ Instance의 멤버 메서드에 접근하기 위해서는 Pointer를 이용하기 위해 ‘.’을 사용해 ‘[Variable Name].[Member Method]();’과 같이 작성해 접근한다.
▹ 다른 메서드 내에서 멤버변수의 값을 사용하기 위해서는 +와 멤버변수 이름을 이용해 사용한다.
- Class의 또 다른 정의
· Data와 Function의 결합
◦ Data 저장 형태의 발전과정
▹ 변수 : 하나의 Data를 저장할 수 있는 공간
▹ 배열 : 같은 종류의 Data들을 하나의 집합으로 묶어 저장할 수 있는 공간
▹ 구조체 : 서로 관련된 Data들을 종류에 얽매이지 않고 하나의 집합으로 묶어 저장할 수 있는 공간
▹ Class : Data와 Function의 결합체(구조체 + 함수)
· 사용자 정의 자료형(User-Defined Type)
1 2 3 4 5 | class [UDtype Name] { [Variable Type 1] [Name 1]; [Variable Type 2] [Name 2]; [Variable Type 3] [Name 3]; } | cs |
◦ Programming Language에서 제공하는 자료형 외에 Programmer가 서로 관련된 변수들을 묶어 하나의 Type으로 새로 추가하는 것
◦ 연관된 변수뿐만 아니라 연관된 함수ㄷ 또한 추가할 수 있다.
◦ Example
1 2 3 4 5 6 7 8 9 10 11 12 | class Time { int hour; int minute; float second; int getHour() { ……… } int setHour() { ……… } ……… } | cs |
3. Variable and Method
- Variable
· Instance Variable
◦ Instance에 따라 고유한 상태를 유지해야하는 속성을 선언할 시 사용된다.
◦ 해당되는 Instance를 생성한 후에만 사용가능하다
◦ 선언 위치 : Class 영역
◦ 생성 시기 : Instance 생성 시기
· Class Variable
◦ 한 Class 내에서 공통적인 값을 유지해야하는 것을 선언할 시 사용된다.
◦ Class가 종료될 때까지 사용 가능하며 Instance가 생성되지 않아도 사용 가능하다.
◦ static을 이용해 선언할 시 Class 내에서만 사용가능한 지역변수로, public을 이용해 선언할 시 Program 어디서든 사용가능한 전역변수로 선언된다.
◦ 선언 위치 : Class 영역
◦ 생성 시기 : Class가 Memory에 Load될 시점
◦ 선언 방법
▹ Class Local Variable : static [Type] [Variable Name]
▹ Global Variable : public [Type] [Variable Name]
· Local Variable
◦ Method, Constructor, Initail Block 내부에서 사용되는 지역변수를 말한다.
◦ 해당 변수가 선언된 Method, Constructor, Initail Block가 종료되면 소멸되어 사용할 수 없게 된다.
◦ 선언 위치 : Class 영역 이외의 영역(Method, Constructor, Initial Block 내부)
◦ 생성 시기 : 변수 선언문이 수행되는 시기
- Method
· 어떠한 작업을 수행하기 위한 명령문의 집합
· 한 번만 작성해 놓고 사용할 때마다 호출해서 사용하면되기 때문에 반복적인 Code 사용을 줄여준다.
· Method 작성 시 고려할 사항
◦ 하나의 Method는 한 가지 기능만 수행하도록 작성
◦ Code 작성 시 반복적으로 수행되어야 하는 여러 문장을 하나의 Method로 정의
◦ 관련된 여러 문장을 하나의 Method로 작성
· Method Coding
1 2 3 | [Return Type] [Method Name]([Type] [Name], ……) { [Operating Code] } | cs |
◦ void Type은 Operating Code 마지막에 return 함수를 사용하지 않으며 그 이외의 모든 Type은 return 함수를 Return Type에 맞게 작성해줘야한다.
· Return 함수
◦ Method가 정상적으로 종료되는 경우
▹ Method Block 내의 마지막 문장까지 수행을 완료했을 시
▹ Method Block 내에 있는 문장을 수행 중 return 함수를 만나 return 함수가 정상적으로 실행되었을 시
◦ Method의 반환 값
▹ 반환 값이 없는 경우
▸ return
▹ 반환 값이 있는 경우
▸ return [Return Value]
· Method Call
1 2 | [Reference Variable].[Method Name](); [Reference Variable].[Method Name([Type] [Name], ……); | cs |
◦ 매개변수가 없는 경우 괄호만 사용해주면되고 매개변수가 있는 경우 해당 변수에 넣을 변수를 모두 써줘야한다.
- JVM Memory Structure
· JVM(Java Virtual Machine)
◦ Java Program을 수행하는데 필요한 Memory를 할당받은 후 System으로부터 할당 받은 후 Memory를 용도에 따라 여러영역으로 나누어 관리하는 Virtual Machine
◦ JVM Memory Structure
▹ Method Area
▸ Class 정보와 Class Variable 정보를 저장하는 공간
▸ Program 실행 과정에서 Class가 사용될 때 해당 Class File을 읽어 분석한 후 Class에 대한 정보를 저장한다.
▹ Call Stack Memory
▸ Main 함수, 일반 Method의 Memory 공간을 제공하는 공간
▸ Call Stack 특징
▫ Method가 호출되면 수행에 필요한 만큼의 Memory를 Stack에 할당받는다.
▫ Method가 수행을 마치고나면 사용했던 Memory를 반환하고 Stack에서 제거된다.
▫ Call Stack의 가장 위에 위치한 Method가 현재 실행 중인 Method이다.
▫ 어떤 Method 아래 있는 Method가 위의 Method가 호출한 Method가 된다.
▹ Heap
▸ Instance와 Instance Variable이 생성되는 공간
- 기본형 매개변수와 참조형 매개변수
· 기본형 매개변수
◦ 원형의 값이 복사만 되며 원형 변수의 값을 변경할 수는 없다.
· 참조형 매개변수
◦ 원형의 주소 값이 복사되며 원형 변수의 값을 읽고 변경까지 가능하다.
- 재귀호출(Recursive Call)
· Method 내에서 Method 자기 자신을 다시 호출하는 것
· 재귀 호출의 특징
◦ 반복적으로 Method를 호출해 Stack Memory의 Resource 또한 반복적으로 소비되므로 비효율적이다.
◦ 간단하게 작성하고자 할 때는 재귀 호출을 사용하는 것이 좋지만 성능에 문제가 생길 수 있을 경우에는 반복문을 사용하는 것이 좋다.
- Instance Method & Variable, Class Method(static Method) & Class Variable
· Instance Method
◦ Instance Variable을 필요로 하는 Method
· Class Method(static Method)
◦ Instance와 관련없는 Method
· Method 특징
◦ Class의 Member Variable 중 모든 Instance에 공통된 값을 유지해야하는 것이 있을 경우 static을 사용한다.
◦ Class Variable의 경우 Instance를 사용하지 않아도 사용가능 하다.
◦ Class Method는 Instance 변수를 사용할 수 없다.
◦ 작성한 Method 중에서 Instance Variable이나 Instance Method를 사용하지 않는 Method에 대해 static을 사용할 것인지를 고려한다.
· Variable 특징
◦ 같은 Class에 속한 Member 간에는 별도의 Instance를 생성하지 않고도 서로 참조 또는 호출이 가능하다.
4. Method Overloading
- Method Overloading
· 같은 이름의 Method를 여러게 정의하는 것
· Overloading 조건
◦ Method의 이름이 같아야한다.
◦ 매개변수의 개수 또는 Type이 달라야한다.
◦ 매개변수는 같고 Return Type이 다른 경우 Overloading이 성립되지 않는다.
· Example
1 2 3 4 5 | void println() void println(boolean x) void println(char x) void println(char[] x) void println(double x) | cs |
· 장점
◦ Overloading을 통해 다른 Type의 변수를 매개변수를 하나의 이름으로 통합할 수 있다.
◦ 같은 이름을 갖기 때문에 기능이나 특성을 쉽게 알 수 있다.
◦ Method 이름을 절약할 수 있다.
5. 생성자(Constructor)
- 생성자
· Instance 초기화 Method로 Instance 변수를 초기화하는 역할을 한다.
· Instance 생성 시 생성자관련 결정 사항
◦ Class 종류 결정
◦ 해당 Class의 생성자 종류 결정
· 생성자 조건
◦ 생성자의 이름은 Class 이름과 같아야 한다.
◦ 생성자는 Return Value가 없다.
· 생성자 정의
1 2 3 4 5 6 7 8 | class [Class Name] { [Class Name]() { [Operating Code] } [Class Name]([Type] [Variable], …) [Operating Code] } } | cs |
- 기본 생성자
· Compile할 경우 생성자가 하나도 존재하지 않을 경우 Compiler가 자동적으로 기본 생성자를 추가한다.
· 모든 Class 내에 생성자가 하나씩 존재해야 한다.
· Compiler에 의해 기본 생성자가 추가되는 경우
◦ Class에 정의된 생성자가 하나도 없을 경우
- 매개변수가 있는 생성자
· Instance 초기화 시 각기 다른 값으로 초기화되어야하는 경우 사용한다.
· 매개변수를 선언해 호출 시 값을 넘겨 받아 Instance를 해당 값으로 초기화한다.
- 생성자에서 다른 생성자 호출
· 생성자 내에 생성자의 이름으로 Class 이름 대신 this()를 사용한다.
· 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫줄에서만 호출이 가능하다.
· 수정이 필요할 시 보다 적은 Code만을 변경하면 되므로 유지보수가 쉽다.
· Example 1
1 2 3 4 5 6 7 | Person() { Name = “thejn”; Gender = “man”; Age = 25;} Person() { this(“thejn“, “man“, 25); } | cs |
· Example 2
1 2 3 4 5 6 7 8 9 10 | Person(String N, String G, int A) { Name = “thejn”; Gender = “man”; Age = 25; } Person(String N, String G, int A) { this.Name = “thejn”; this.Gender = “man”; this.Age = 25; } | cs |
· Instance 복사
◦ 생성자를 이용하면 현재 사용하고 있는 Instance와 같은 상태를 갖는 Instance를 더 만들 수 있다.
◦ Example
1 2 3 4 5 | Person(Person P) { Name = P.Name; Gender = G.Gender; Age = A.Age; } | cs |
· this Method
◦ Instance 자신을 가리키는 참조변수
◦ Instance의 주소가 저장되어 있다.
◦ this, this(매개변수)
▹ 생성자, 같은 Class의 다른 생성자를 호출할 떄 사용된다.
6. 변수의 초기화
- 초기화
· 변수를 선언하고 처음으로 값을 저장하는 것
· 영역 변수별 초기화
◦ Class Member Variable : 기본값으로 자동 초기화
◦ Instance Member Variable : 기본값으로 자동 초기화
◦ 지역변수 : 초기화 필요
· 초기화 기본값
◦ boolean : false
◦ char : ‘\u0000’
◦ byte : 0
◦ short : 0
◦ int : 0
◦ long : 0L
◦ float : 0.0f
◦ double : 0.0d or 0.0
◦ 참조형 변수 : null
· Member 변수 초기화 방법
◦ 명시적 초기화(Explicit Initialization)
▹ 변수를 선언과 동시에 초기화하는 것
▹ Example
1 2 3 4 | class Person { String Name = new String(); int Age = 25; } | cs |
◦ 생성자(Constructor)
◦ 초기화 블록(Initialization Block)
▹ Instance Initialization Block
▸ Instance Variable의 복잡한 초기화에 사용
▸ 생성자와 같이 Instance를 생성할 때마다 수행
▸ 생성자와 같이 수행되기 때문에 잘 사용되지 않지만 모든 생성자에서 공통적으로 수행해야하는 Code가 있을 시 Code의 중복을 줄이기 위해 사용된다.
▸ Class 내부에 {}를 이용해 Block 작성
▸ Example
1 2 3 4 5 | class InitBlock { { [Instance Initialization Block Code] } } | cs |
▹ Class Initialization Block
▸ Class Variable의 복잡한 초기화에 사용
▸ Class가 Memory에 처음 Load될 때 한번만 수행
▸ Class 내부에 static과 {}를 이용해 작성
▸ Example
1 2 3 4 5 | class InitBlack { static { [Class Initialization Block Code] } } | cs |
- 초기화 시기 및 순서
· Member Variable 종류별 초기화 시점
◦ Class Variable
▹ Class가 처음 Load될 때 단 한번 초기화 된다.
◦ Instance Variable
▹ Instance가 생성될 때마다 각 Instance 별로 초기화가 이루어진다.
· Member Variable 종류별 초기화 순서
◦ Class Variable
▹ 기본값 → 명시적 초기화 → Class Initialization Block
◦ Instance Variable
▹ 기본값 → 명시적 초기화 → Instance Initialization Block → 생성자
'Java > Theory' 카테고리의 다른 글
Chapter 6. Collection Framework (0) | 2015.08.19 |
---|---|
Chapter 5. Inner Class (0) | 2015.08.19 |
Chapter 4. java.lang Package (0) | 2015.08.19 |
Chapter 3. Exception Handling (0) | 2015.08.19 |
Chapter 2. 객체지향 프로그래밍 II (0) | 2015.08.19 |