객체지향 프로그래밍 1

안재민·2025년 4월 6일

JAVA

목록 보기
6/6
  • Object-oriented Programming 1

1. 객체지향이란?

기존에 사용하던 절차지향언어에 몇 가지 새로운 규칙을 추가한 것

  1. 코드의 재사용성을 높임

    새로운 코드를 작성할 때, 기존의 코드를 이용하여 쉽게 작성할 수 있음

    • Overloading 예제
    #include <stdio.h>
    
    void swap_two(int *a, int *b){
        int tmp = *b;
        *b = *a;
        *a = tmp;
    }
    
    void swap_three(int *a, int *b, int *c){
        int tmp = *a;
        *a = *b;
        *b = *c;
        *c = tmp;
    }
    
    int main(){
        int a = 1;
        int b = 2;
        int c = 3;
    
        swap_two(&a, &b);
        printf("After swap_two: a = %d, b = %d\n", a, b);  // 출력: a = 2, b = 1
    
        swap_three(&a, &b, &c);
        printf("After swap_three: a = %d, b = %d, c = %d\n", a, b, c);  // 출력: a = 1, b = 3, c = 2
    
        return 0;
    }
    
    class IntWrapper {
        int value;
        IntWrapper(int value) {
            this.value = value;
        }
    }
    
    public class Test {
    
        static void swap(IntWrapper a, IntWrapper b){
            int tmp = a.value;
            a.value = b.value;
            b.value = tmp;
        }
    
        static void swap(IntWrapper a, IntWrapper b, IntWrapper c){
            int tmp = a.value;
            a.value = b.value;
            b.value = c.value;
            c.value = tmp;
        }
    
        public static void main(String[] args) {
            IntWrapper a = new IntWrapper(1);
            IntWrapper b = new IntWrapper(2);
            IntWrapper c = new IntWrapper(3);
    
            System.out.println("Before swap:");
            System.out.println("a=" + a.value + " b=" + b.value + " c=" + c.value);
    
            swap(a, b);
            System.out.println("\nAfter 2-way swap:");
            System.out.println("a=" + a.value + " b=" + b.value);
    
            swap(a, b, c);
            System.out.println("\nAfter 3-way swap:");
            System.out.println("a=" + a.value + " b=" + b.value + " c=" + c.value);
        }
    }
    
  2. 코드의 관리가 용이함

  3. 신뢰성이 높은 프로그래밍

    제어자와 메서드를 이용해 데이터 보호

2. 클래스와 객체

class : 객체를 정의해놓은 것

객체와 인스턴스

클래스로부터 객체를 만드는 과정 : 클래스의 인스턴스화

클래스로부터 만들어진 객체 : 클래스의 인스턴스

클래스의 또 다른 정의

데이터 처리를 위한 데이터 저장형태의 발전과정

변수 → 배열 → 구조체 → 클래스

1개 → 같은 타입 여러개 → 다른 타입들 → 다른 타입들 + 함수

3. 변수와 메서드

선언위치에 따른 변수의 종류

클래스 변수 : 클래스 영역 + 클래스가 메모리에 올라갈 때 생성

인스턴스 변수 : 클래스 영역 + 인스턴스가 생성되었을 때

지역 변수 : 클래스 영역 이외의 영역 + 변수 선언문이 수행되었을 때

JVM의 메모리 구조

method area, call stack, heap

  • method area 프로그램 실행 중 클래스가 사용되면, *.class 파일을 읽어 클래스 데이터를 이곳에 저장 클래스 변수도 이 영역에 함께 생성
  • call stack 인스터스가 생성되는 공간, 인스턴스 변수가 생성
  • heap 메서드가 호출되면, 호출된 메서드를 위한 메모리 할당

클래스 메서드(static 메서드)와 인스턴스 메서드

메서드 앞에 static → 클래스 메서드

없으면 → 인스턴스 메서드

어느 경우에 클래스 메서드를 사용해야하는가?

인스턴스와 관계없는 메서드 → 인스턴스 변수를 사용하지 않으면 일반적으로 클래스 메서드로 정의

인스턴스 변수를 사용하지 않는데 클래스 메서드로 정의하지 않으면, 메서드 호출 시 메서드를 찾는 과정이 추가되기 때문

4. 오버로딩 (overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

  • 메서드 이름이 같아야 한다
  • 메개변수의 개수 또는 타입이 달라야 한다
  • 반환 타입은 영향 x

가변인자(varags)와 오버로딩

가변인자 (variabler arguments)

타입… 변수명

public PrintStream printf (String... str) { ... }

public PrintStream printf (String formant, Object... args) { ... }

가변인자 vs 배열

  • String… str vs String[] str
public concatenate (String... str) { ... }
public concatenate (String[] str) { ... }

String result = concatenate (new String[0]);
String result = concatenate (null);
String result = concawtenate (); // 에러 인자가 필요함 

배열로 지정하게되면, 반드시 인자를 지정해야함 → 인자를 생략할 수 없음

5. 생성자 (Constructor)

  • 생성자의 이름은 클래스의 이름과 같아야한다
  • 생성자는 리턴 값이 없다

연산자 new가 인스턴스를 생성하는 것이고, 생성자는 인스턴스를 생성하는 것이 아니다.

단순히 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드이다.

생성자에서 다른 생성자 호출하기

  • this(), this

생성자 간에도 서로 호출이 가능

  • 생성자의 이름으로 클래스 이름 대신 this를 사용
  • 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능

생성자를 왜 사용해야하는가?

  • 클래스 - 어떤 클래스의 인스턴스를 생성할 것 인가?
  • 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것 인가?

간격하고, 직관적인 코드를 작성할 수 있음

ex) 인스턴스 복사본을 만들때

class Car {
	String color;
	String gearType;
	int door;
	
	Car() {
		this("white","auto",4);
	}
	
	Car(Car c) {
		this(c.color, c.gearType, int door);
	}
	
	Car(String color, String gearType, int door){
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}
}

6. 변수의 초기화

명시적 초기화, 클래스 초기화 블록, 인스턴스 초기화 블록

0개의 댓글