클래스와 객체
1. 객체지향프로그래밍 OOP (ObjectOrientedProgramming)
객체지향 프로그래밍이란 객체를 이용하는 프로그래밍 방식을 말한다
객체란 현실 세계에서 흔히 찾아볼 수 있는 대상을 추상화 하여 프로그램 상에서 만들어낸 결과물이라 할 수 있다
따라서 객체지향 프로그래밍은 현실세계의 객체간의 상호작용(행위)를 프로그래밍을 통하여 가상세계(코드)로 구현하는 과정이라고도 할 수 있다
[ 특징 ]
-
추상화(Abstraction)
- 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술
- 해당 단계에선 소스 코드의 구현이 아닌, 데이터들의 객체화와 객체들 간의 관계에 대한 모델링 과정이 중요하다
- 클래스(class)는 추상화한 내용을 정리한 설계도와 같은 것이고, 객체는 클래스를 실제 사용한 프로그램 상에서의 결과물이라고 볼 수 있다
-
캡슐화(EnCapsulation)
- 객체 지향의 가장 중요한 데이터 보호 기술
- 외부에서 클래스 내부의 데이터에 접근하지 못하도록 막는 것이 핵심이다
-> 여러 자료형 변수들을 class 영역 안에서 접근제한자 private를 사용하여 멤버 변수(Field)로 선언하는 식으로 사용 가능 - 이렇게 외부에서 클래스 내부의 데이터를 접근하지 못하도록 설정하여 해당 객체의 데이터를 보호하는 것을 정보 은닉(Information Hiding)이라고 한다
- 객체지향의 설계 원칙 중 하나가 바로 정보은닉이며 그 기술 중 하나가 캡슐화 라고 할 수 있다
-
상속(Inheritance)
- 클래스의 재사용과 소스 코드의 중복 제거를 목적으로 하는 기술
-
다형성(Polymorphism)
- 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술
2. 클래스(class)
- 객체를 만들기 위해 필요한 객체의 설계도이다
- 각 객체들의 속성(정보)들을 담아낼 수 있는 그릇과도 같은 존재이다
- 객체 외부에서 멤버변수(Field)로의 접근을 제한하며 멤버 변수들을 하나의 타입으로 묶어준다
- 추상화와 캡슐화 과정을 거쳐 클래스를 만들 수 있다
[ 클래스 구조 ]
public class 클래스명 {
// 필드부
// 생성자부
// 메소드부
}
-
클래스 해더(Header) 시그니처(Signature)
[접근제한자] [클래스식별자] class 클래스이름
- 클래스의 이름과 종류를 지정하는 구간이다
- 클래스 식별자 (Identifier)엔 클래스의 종류를 지정하는 예약어로 final , abstract 두 가지를 사용 가능하다
- public final class 클래스명
-> 종단 클래스이자 더 이상 상속시킬 수 없는 클래스로 서브(후손) 클래스를 만들 수 없다 - public abstract class 클래스명
-> 추상(미완성된)클래스로 상속을 이용해 후손 클래스가 부모의 미완성된 기능을 완성시킨다
-
클래스 바디(Body)
- 클래스의 멤버들이 정의되는 구간이다
- 필드부
- 필드는 멤버변수, 인스턴스 변수라고도 할 수 있다
- [접근제한자] [예약어] [자료형] [필드명];
- 생성자부
- 해당 클래스의 생성자를 선언한다
- 생성자를 따로 명시하지 않아도 JVM이 자동으로 기본 생성자를 생성해준다
- 다만 생성자를 직접 명시하여 선언한 것이 있다면 JVM은 기본 생성자를 따로 생성해주지 않으니 필요하다면 기본 생성자 또한 추가로 선언하여 사용해야한다
- 메소드부
- 각 기능을 구현하는 부분
- [접근제한자] [반환형] [메소드명(매개변수)]
- setter, getter 등의 메소드들을 위치시킨다
[ 멤버변수 (Field) ]
접근제한자 식별자 자료형 변수명 [= 초기값]
클래스에 소속된 멤버 변수와 멤버 상수를 필드(Field) 라고 하며, 클래스 내부에 선언한다
-
인스턴스(Instance) 변수
접근제한자 자료형 변수명;
- 클래스 { } 안쪽에 선언된다
- 클래스에 대한 객체(인스턴스)를 동적 메모리에 할당할 때 객체 공간 안에 생성되는 필드들을 말한다
-
클래스 변수
접근제한자 static 자료형 필드명;
- 클래스 { } 안쪽에 선언된다
- 멤버 변수 선언시 자료형 앞에 static 키워들을 붙여 선언한 필드를 말한다
- 해당 클래스형 객체들이 모두 공유하는 필드가 된다
-
지역 변수 (Local Variable)
- 메소드 { } 안쪽에 선언된 변수로 메소드 내에서만 사용이 가능하다
- 메소드 실행시 메모리에 생성되었다가 메소드 종료시 메소드와 같이 메모리에서 소멸되어 사용할 수 없게 된다
[ 멤버함수 (Method) ]
클래스 { } 안쪽에 작성되는 함수로 멤버변수들에 대한 기능 및 동작을 정의한다
- 종류
- 인스턴스 메소드 (non-static method)
- 클래스에 소속된 일반 메소드이다
- 클래스에 대한 객체의 주소(레퍼런스)를 전달받아 해당 주소 위치에 있는 객체의 인스턴스 변수 값들을 연산 처리한다
ex) 레퍼런스.메소드명
- 클래스 메소드 (static method)
- 클래스 멤버함수 작성시 메소드 반환자료형 앞에 static 키워드를 사용한 메소드이다
- 인스턴스 메소드와는 다르게 호출 시 객체의 레퍼런스를 사용하지 않고 클래스명을 사용하여 호출한다
ex) 클래스명.메소드명
- 인스턴스 메소드 (non-static method)
[ 메소드 오버로딩 (Overloading) ]
하나의 클래스 영역 내에서 이름이 같은 메소드를 여러 개 정의할 수 있다(= 오버로딩)
- 메소드 이름은 반드시 같아야 한다
- 매개변수의 자료형과 개수는 서로 다르게 구정되어야 한다
3. 객체(object)와 인스턴스(instance)
- 추상화가 이루어진 클래스로부터 데이터가 존재하는 실체로 만드는 과정을 인스턴스화(instantiation)라고 한다
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance) 라고 한다
- 자바에서는 객체(인스턴스)는 무조건 메모리 힙(Heap) 영역에 할당되도록 되어있다
- 힙(Heap) 영역에 할당된 객체의 주소를 기록할 참조(Reference)변수를 사용하여 객체를 참조한다
4. 접근 제한자 (Access Modifier)
[ 접근 제한자의 종류 ]
접근 제한자의 공개 범위는 public > protected > default > private 순으로 좁아진다 protected 접근 제한자는 상속관계가 아니면 잘 사용하지 않는다
-
(+) public
- 클래스 안과 밖, 패키지 안과 밖에 있는 모든 클래스들이 접근 가능하다
-
(#) protected
- 같은 패키지에 속한 클래스 간에만 멤버의 접근이 가능하다
- 다른 패키지에 있는 클래스일 때는, 상속관계의 후손 클래스 내에서만 부모 클래스의 멤버에 접근 가능하다
- 비 상속시에는 default와 동일하게 동작한다
-
(~) default (package private)
- 같은 패키지에 속한 클래스 간에만 멤버들에 대한 접근이 가능하다
- default는 단어로 명시되지 않는다, 따라서 접근제한자가 생략되어있다면 default라고 할 수 있다
-
(-) private
- 클래스 안에서만 접근이 가능하며 클래스 밖에서는 접근이 불가능하다
- 멤버변수의 캡슐화를 위해 사용되는 제한자이다
댓글남기기