[JAVA] ch5: 클래스와 객체

oow·2026년 4월 11일

JAVA

목록 보기
9/13

OOP

OOP

OOPObject-Oriented Programming의 줄임말으로, 객체를 중심으로 생각하는 객체지향 프로그래밍을 말한다. 객체란 고유의 특성(속성)과 행동(메소드)를 가지는 존재를 말한다. 문법적으로는 C의 구조체에 함수가 합쳐진 것으로 이해하면 된다. OOP의 주요 개념으로는 캡슐화, 추상화, 상속, 다형성이 있다.

이렇게 속성과 메소드를 하나로 묶어 관리하는 것을 캡슐화라고 한다. 사물의 특성과 행동을 대략적으로 파악하는 것을 추상화라고 하며, 세밀화와 반대되는 개념이다. 추상화한 객체들을 하나씩 구현하여 조립하는 것이 객체지향 프로그래밍이라 할 수 있다.



절차지향 프로그래밍

절차지향 프로그래밍에서는 문제를 처리하는 순서가 중요하다. 때문에 순서를 우선으로 파악한 후 이를 함수로 작성하는데, 이를 모듈화라고 한다. 반면 객체지향 프로그래밍은 객체를 우선으로 파악하는데, '어떤 객체가 어떤 일을 처리해야 할까?' 하는 관점에서 접근하는 것이다. 그러나 객체지향 프로그래밍에서도 모듈화는 빠지면 안되는 중요한 요소이다.

  • 절차지향 프로그래밍 -> 순서도
  • 객체지향 프로그래밍 -> 다이어그램 (구조+순서)



OOP의 장점

그렇다면 OOP는 왜 중요할까? OOP는 소프트웨어를 재사용하거나 부분적으로 수정하는 것이 용이하기 때문에 소프트웨어 생명주기를 단축할 수 있다. 또한 객체와 객체들의 관계를 우선적으로 파악함으로써 현실 세계의 문제에서 요구하는 바를 효율적으로 해결할 수 있다.



OOP의 4대 속성

  • 캡슐화
    캡슐화는 필요한 부분은 보여주고 필요없는 부분은 숨기는 것을 말한다. 접근 제한자(public, private, protected)를 이용하여 구분할 수 있다. 예를 들어, private인 객체는 외부 객체에서 접근할 수 없다. 대신 getter/setter 메소드를 이용하여 접근하도록 구현할 수 있다. 이처럼 복잡한 내부 구조는 숨기고 단순한 인터페이스로 객체를 사용하도록 만드는 것이다.

  • 추상화
    추상화는 객체를 단순화하여 간단한 속성+메소드로 나타내는 과정이다. 객체의 세부사항을 제외하고 주요 본질만 뽑아 시스템을 구현하는 것이다. 일반화와 비슷한 개념으로 생각할 수 있다. OOP에서 일반화는 여러 클래스의 공통된 부분을 모아 상위클래스로 묶어 표현하는 것을 말한다.

-> 사물을 객체로 표현하는 것은 추상화, 이를 클래스로 구현하는 것은 캡슐화이다.

  • 상속
    상속은 이미 만들어둔 클래스의 기능을 물려받아 사용하는 것이다. B 클래스를 만들고자 하는데 이와 기능이 유사한 A 클래스를 만들어두었다면, A 클래스를 상속받아 기능을 재사용할 수 있다.

  • 다형성
    다형성은 같은 이름을 사용하지만 기능을 달리하는 것을 말한다. 예를 들어, 동물이라는 상위 클래스에 움직이기() 메소드가 있다면, 동물의 하위 클래스인 개, 고양이, 뱀 등에서는 각기 다른 움직이기()를 구현할 수 있다.




클래스

클래스와 객체

클래스는 틀이다. 객체의 속성과 메소드를 정의한다. 객체는 클래스라는 틀로 찍어낸 인스턴스이다. 사람이라는 클래스가 있다면 사람 a = new 사람()과 같이 a라는 사람 객체 만들 수 있다.

클래스이름.java로 파일을 생성하여 public class 클래스이름 {}을 작성한 후 #javac 클래스이름.java로 컴파일하면 클래스이름.class가 생성된다. 하나의 파일에서 여러 개의 클래스를 선언하는 것도 가능하지만, 주로 하나의 클래스를 선언하는 것을 권장한다. 여러 개를 선언할 경우 여러 개의 .class 바이트 코드 파일이 생성된다.


클래스에는 필드와 메소드가 있다. 필드는 객체의 값을 저장하는 멤버 변수이고, 메소드는 객체의 행동을 구현하는 함수이다.


  • 클래스이름 변수; -> 클래스의 객체 선언, 스택에 저장
  • 변수 = new 클래스이름(); -> new 키워드로 클래스 모양의 객체 생성(클래스 타입 크기의 메모리 항당), 변수에 저장
  • 변수.멤버 -> 객체 멤버 접근
  • 변수.메소드() -> 객체 메소드 호출



생성자

생성자는 객체가 생성될 때 초기화를 위해 실행되는 메소드이다. new 키워드로 객체를 생성할 때 호출된다. 이때 new 강아지("댕댕이");와 같이 초기값을 넣어줄 수 있다.

생성자는 클래스에서 하나 이상 선언되어야 하며, 작성하지 않았다면 JAVA 컴파일러가 기본 생성자를 삽입한다. 기본 생성자는 매개 변수가 없다. 다만 매개 변수가 있는 생성자를 만들었다면 기본 생성자가 자동으로 생성되지 않으므로, 매개 변수가 없는 기본 생성자를 선언하는 것이 좋다. 생성자 이름은 클래스 이름과 동일해야 한다. 생성자는 필요에 따라 여러 개 작성하는 것도 가능하다.


  • 매개 변수가 있는 생성자가 존재하므로, 기본 생성자를 따로 적어주어야 new Book()이 가능하다.
  • 매개 변수가 다른 생성자들 -> 이름이 같고 매개 변수의 개수와 타입이 서로 다른 메소드 오버로딩과 같다.

  • 생성자가 2개인 클래스 -> 매개 변수가 다르다.
  • 기본 생성자로 생성한 donut은 초기값이 radius=1, name="없음"이다.
  • 매개변수를 가진 생성자로 생성한 pizza는 10과 "자바피자"를 인자로 넘겨주어 각각 radius, name이 된다.



this 레퍼런스

this.멤버객체 자신의 멤버를 가리키는 레퍼런스이다. 매개변수와 이름이 같을 때 인스턴스 멤버임을 명확히 하여 구분이 용이하다.

public class Circle {
	int radius;
	public Circle(int radius) {
		this.radius = radius;
        // this.radius는 위에서 int radius로 생성한 객체의 멤버이다.
        // 우변의 radius는 인자로 받은 값이다.
    }
}




Review

메소드 오버로딩

  • 이름이 같다.
  • 매개변수의 개수나 타입, 순서가 다르다.
  • 리턴타입은 관계없다. -> 리턴타입이 다르고 매개변수가 같으면 오버로딩 x

  • double plus(int x, int y) {} -> plus(int, int)가 이미 존재하므로 추가 불가능하다. (리턴타입은 관계 x)



메소드 인자 전달

  • 기본 변수
    • int, double 등... -> 값을 복사하여 전달한다.
    • 메소드에서 매개변수가 변경되어도 전달한 인자 값은 변경되지 않는다.
    • 메소드에서 변경된 값을 리턴받는 것은 가능하다.
  • 객체 변수
    • 객체 혹은 배열의 레퍼런스 값을 전달한다(객체 이름, 레퍼런스 변수 이름).
    • 복사하여 전달하는 것이 아닌, 레퍼런스 값을 전달한다. -> 메소드에서 매개변수 변경 시 원본(객체의 필드, 배열 원소)도 변경된다.
  • 배열 변수
    • 객체 전달과 마찬가지로 배열의 주소가 전달된다. -> 메소드에서 변경한 사항이 반영된다.



객체의 치환/소멸/가비지컬렉션

  • 치환
    • 레퍼런스(주소)가 복사된다. -> 같은 곳을 가리킨다.
    • ob1 = ob2
  • 소멸
    • JAVA에서는 명시적인 소멸 문법이 없다.
    • 사용되지 않는 객체는 가비지컬렉터가 메모리에서 자동해제시킨다.
    • 개발자가 System.gc() 메소드로 가비지컬렉션을 요청할 수 있다. -> 실행 시점은 JVM이 결정한다.



객체 배열

Circle [] c; // 원소가 Circle인 배열의 레퍼런스 변수 c 선언
c = new Circle[5]; // 레퍼런스 배열 생성
for(int i=0; i<c.length; i++)
	c[i]=new Circle(i); // 배열의 각 원소 객체 생성

객체를 담은 배열 공간을 만들고, 객체를 생성하여 각 배열 공간에 객체의 주소를 저장한다. 일반 배열과 마찬가지로 c[i]로 각 원소에 접근하고, 일반 객체와 마찬가지로 .메소드이름()으로 객체 메소드를 호출할 수 있다.




실습 복기

AmaterasUML - Class Diagram

  • 초기 모델링 시 사용



PlantUML

  • 현 코드 상태를 확인할 때 사용

0개의 댓글