Posts 객체지향 프로그래밍 - 1(Object Oriented Programming)
Post
Cancel

객체지향 프로그래밍 - 1(Object Oriented Programming)

객체지향 프로그래밍(Object Oriented Programming)

객체지향 프로그래밍이란?

  • 컴퓨터 프로그래밍 패러다임 중 하나
  • 프로그램을 명령어의 목록으로 보는 시각에서 벗어나, 독립된 단위인 객체의 모임
  • 각각의 객체는 메세지를 주고받고, 데이터를 처리

기본 구성 요소

  • 클래스(Class)
    • 같은 종료의 집단에 속하는 속성과 행위를 정의한 것
    • 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인해야 함
  • 객체(Object)
    • 클래스의 인스턴스로, 실제로 메모리상에 할당된 것
    • 자신 공유의 속성을 가지며, 클래스의 정의된 행위를 수행
  • 메소드(Method)
    • 클래스로부터 생성된 객체를 사용하는 방법
    • 메소드는 한 객체의 속성을 조작하는데에 사용

특징

  • Abstraction(추상화): 자료 표현을 추상적으로 나타내는 추상 자료형을 사용한다.
  • Polymorphism(다형성): 오버로딩과 오버라이딩을 하여 하나의 메소드명으로 다양한 동작을 구현할 수 있다.
  • Inheritence(상속): 부모 클래스로부터 속성과 메소드를 상속받아 사용할 수 있다.
  • Encapsulation(캡슐화): 사용자에게 불필요한 정보를 은닉/보호해야 한다.

객체 생성

1
2
3
4
5
6
7
8
9
class Car{ // 클래스 이름은 보통 PascalCase로 적는다.
    int speed = 0; // 속성 or 멤버 변수
    // 속성: Attribute, Field
    // 멤버 변수: member variable

    public void move(){ // 메소드 (method)
        speed = 10; // 행위를 구현하며, 주로 속성을 변경한다.
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String args[]){
        Car car = new Car(); // new 키워드로 클래스에서 객체 생성
        System.out.println(car.speed); // .으로 속성 접근 가능
        car.move(); // 메소드 호출
        System.out.println(car.speed); // 10

        Car car1 = new Car(); // 독립적인 새로운 객체 생성
        System.out.println(car1.speed); // 0

        Car car2 = car; // 참조형 객체. 새로운 객체를 만드는 것이 아니라 해당 값을 가리키기만 한다. car2->car
        System.out.println(car2.speed); // 10
        car2.speed = 5; // 참조형 객체이기 때문에 car의 speed 값도 같이 바뀐다.
        System.out.println(car.speed); // 5
    }

클래스와 객체의 메모리 구조

  • 클래스 영역(Class area, method area, code area, static area)
    • field 정보, method 정보, type 정보, constant pool이 저장된다.
  • 스택 영역(Stack area)
    • method 호출 시 선언된 로컬 변수가 저장된다.(임시로 있다가 사라짐)
  • 힙 영역(Heap area)
    • new 키워드로 생성된 객체가 저장된다.
    • garbage collection이 동작하는 영역이다. -> 더이상 사용하지 않는 메모리를 알아서 반환하는 JVM의 기능
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      public class MemoryStructure_Class { // 클래스 영역
       int x, y; // 힙 영역
       String string = "문자열!!!"; // string 변수는 힙영역, "문자열!!!"은 constant pool에 저장된다.
                              // string은 객체이므로 힙 영역에 string의 참조형 값이, constant pool에 데이터 값이 저장된다.
       // 객체가 생성되면서 변수도 같이 생성되므로 객체와 같이 힙영역에 저장된다.
       public void method(int value){ // 클래스 영역
      value = 10;-> 스택 영역
      char c = '='; // 스택 영역
       }
      }
      

클래스에서 사용되는 변수의 종류

  • 클래스 멤버 변수(static variable, class variable)
  • 인스턴스 변수(member variable, attribute)
  • 로컬 변수(local variable)
  • 로컬 파라미터 변수(local parameter variable, argument)
  • 사용 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Variable_Class {
    static int classVar; // 클래스 멤버 변수. 별도로 초기화 하지 않으면 0으로 자동으로 초기화.
    int instanceVar; // 인스턴스 멤버 변수. 별도로 초기화 하지 않으면 0으로 자동으로 초기화.
    public void method(int paramVar){ // 로컬 파라미터 변수
        System.out.println(paramVar); // 로컬 파라미터 변수 출력
        int localVar; // 로컬 변수
        //System.out.println(localVar); 로컬변수는 자동으로 초기화 되지 않기 때문에 초기화 하지 않은 상태에서는 출력 불가.
        localVar = 10;
        System.out.println(localVar); // 로컬 변수 출력
        {
            localVar = 10; // 상위 블록에서 선언 된 것은 하위 블록에서 변경 가능
            int localVar2 = 20;
        }
        // localVar2 = 10; // 생명주기가 끝났으므로 접근 불가. 하위 블록에서 선언한 변수는 상위블록에서 사용할 수 없다.
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class VariableTest{
    public static void main(String[] args) {
        System.out.println("클래스 멤버 변수");
        System.out.println(Variable_Class.classVar); // 클래스 변수는 클래스 이름으로 바로 접근 가능
        Variable_Class.classVar = 5; // 클래스 이름으로 접근하여 값 변경도 가능
        System.out.println(Variable_Class.classVar);

        System.out.println("인스턴스 멤버 변수");
        Variable_Class vr = new Variable_Class();
        System.out.println(vr.instanceVar);
        // Variable_Class.instanceVar 클래스 이름으로는 접근 불가.
        vr.instanceVar = 20;
        System.out.println(vr.instanceVar);
        System.out.println(vr.classVar); // 클래스 변수는 객체에 할당되는 값이 아니기 때문에 가능하나 권장하지 않음.

        System.out.println("로컬 변수");
        vr.method(9);
    }
}
This post is licensed under CC BY 4.0 by the author.

Contents

Trending Tags