Java/Theory

Chapter 1. 객체 지향 프로그래밍 I

The_j.n 2015. 8. 19. 03:41

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 → 생성자