Programming/Java
객체지향 기초
Boxya
2025. 4. 28. 21:12
[KT] AIVLE SCHOOL 24일차
객체의 개념
- 소프트웨어 객체는 현실 세계의 객체를 필드와 메서드로 모델링한 것
- 소프트웨어 객체는 상태를 필드(Field)로 정의하고 동작을 메서드(Method)로 정의
- 필드는 객체 내부에 선언된 변수를 의미하고 메서드는 객체 내부에 정의된 동작
절차 지향 프로그래밍
- 일련의 동작을 순서에 맞추어 단계적으로 실행하도록 명령어를 나열
- 데이터를 정의하는 방법보다는 명령어의 순서와 흐름에 중점
- 수행할 작업을 예상할 수 있어 직관적인데 규모가 작을 때는 프로그래밍과 이해하기가 용이
- 소프트웨어는 계산 위주이므로 절차 지향 프로그래밍이 적합
객체 지향 프로그래밍
- 절차 지향 프로그래밍 방식의 한계
- 소프트웨어의 규모가 커지면서 동작과 분리되어 전 과정에서 서로 복잡하게 얽혀 있는 데이터를 사용
- 절차 지향 프로그램은 추후 변경하거나 확장하기도 어려움
- 현실 세계를 객체 단위로 프로그래밍하며 객체는 필드(데이터)와 메서드(코드)를 하나로 묶어 표현
객체지향 기초
- 객체와 클래스
- 클래스 선언과 파일
- 보통 소스 파일마다 하나의 클래스를 선언하지만 2개 이상의 클래스를 하나의 파일로 선언 가능
- 하나의 파일에 클래스가 둘 이상 있다면 하나만 public로 선언할 수 있고 해당 클래스 이름은 소스 파일 이름과 동일해야 함
- 클래스의 구성 요소
- 멤버 : 필드, 메서드
- 필드는 기본 값이 있지만 지역 변수는 기본 값이 없어 반드시 초기화
- 필드는 클래스 전체에서 사용할 수 있지만 지역 변수는 선언된 블록 내부의 선언된 후에서만 사용 가능
- 지역 변수는 메서드 내부에 선언된 변수, 매개 변수도 일종의 지역 변수
- 생성자
- 생성자의 역할 : 객체를 생성하는 시점에서 필드를 다양하게 초기화
- 생성자 이름은 클래스 이름과 같고 반환 타입은 없음
- 생성자는 new 연산자와 함께 사용하며 객체를 생성할 때 호출
- 생성자도 오버로딩할 수 있음
- 모든 클래스는 최소한 하나의 생성자가 있음
- 만약 생성자를 선언하지 않으면 컴파일러가 자동으로 디폴트 생성자를 추가
- 멤버 : 필드, 메서드
- 필드와 메서드 접근
- e.g. 객체참조변수.멤버
- 클래스 내부에서 자신의 멤버에 접근하려면 참조 변수 this 혹은 참조 변수 없이 그냥 멤버 이름 그대로 사용하면 됨
- 예를 들어 외부 클래스 Circle의 객체 myCircle이 있다면 myCircle 객체의 radius와 findArea()는 다음과 같이 접근
- myCircle.radius / myCircle.findArea()
- 클래스가 radius 필드와 findArea() 메서드를 포함한다면 클래스 내부에서는 다음과 같이 사용
- radius / this.radius | findArea() / this.findArea
- 클래스 선언과 파일
- 캡슐화(정보 은닉)
- 데이터를 정의하는 방법보다는 명령의 순서와 흐름에 중점
- 상속
- 상속 자녀가 부모 재산을 상속받아 사용하듯이 상위 객체를 상속받은 하위 객체가 상위 객체의 메서드와 필드를 사용
- 상속은 개발된 객체를 재사용하는 방법 중 하나
- 다형성
- 대입되는 객체에 따라서 메서드를 다르게 동작하도록 구현하는 기술
- 실행 도중 동일한 이름의 다양한 구현체 중에서 메서드를 선택 가능
- 추상화
- 현실 세계의 객체는 수많은 상태가 있고 다양한 동작을 하지만 클래스에 모두 포함하기는 어려움
- 이를 위해 추상화(Abstraction)하는 과정이 필요
- 추상화는 현실 세계의 객체에서 불필요한 속성을 제거하고 중요한 정보만 클래스로 표현하는 일종의 모델링 기법
- 따라서 사람마다 추상화하는 기법이 같지 않으므로 각 개발자는 클래스를 다르게 정의 가능
접근자와 설정자
- 클래스 내부에 캡슐화된 멤버를 외부에서 사용할 필요
- private으로 지정된 필드에 값을 반환하는 접근자와 값을 변경하는 설정자는 공개된 메서드
- 일반적으로 접근자는 get, 설정자는 set으로 시작하는 이름을 사용
- 필드 이름을 외부와 차단에서 독립시키기 때문에 필드 이름 변경이나 데이터 검증도 가능
정적 멤버
- 자바는 static 키워드로 클래스의 필드를 공유할 수 있도록 지원
- 인스턴스 변수
- static 키워드로 지정되지 않아 공유되지 않은 필드로 인스턴스마다 자신의 필드를 생성
- 객체별로 관리, 객체를 생성할 때 인스턴스 변수도 객체가 소멸될 때 자동으로 소멸
- 정적 변수 혹은 클래스 변수
- static 키워드로 지정하여 모든 인스턴스가 공유하는 필드
- 클래스 로더가 클래스를 메서드 영역에 적재할 때 생성
- 객체와 관련된 인스턴스 변수를 사용할 수 없음
- 객체와 관련된 인스턴스 메서드를 호출할 수 없음
- 객체 자신을 가리키는 this 키워드를 사용할 수 없음