본문 바로가기

Java/Theory

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

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