[Java]객체지향 프로그래밍 I
1. 객체지향언어
- 기존 프로그래밍 언어에 몇 가지 새로운 규칙을 추가하여 유기적으로 프로그램 구성
- 객체(Object) 를 중심으로 프로그램을 설계하고 구현하는 프로그래밍 방식
- 데이터(속성)와 이를 조작하는 메서드(기능)를 하나의 객체로 묶어 설계하는 방식
장점
- 코드 재사용: 상속을 통해 기존 코드 활용 가능
- 유지보수 용이: 캡슐화를 통해 코드 수정이 쉬움
- 확장성 증가: 다형성을 통해 새로운 기능 추가 가능
- 가독성 향상: 코드가 논리적으로 구성되어 이해하기 쉬움
단점
- 절차지향(Procedural) 프로그래밍보다 구조가 복잡해짐
- 객체 생성과 메시지 전달 과정(메서드 호출 등)에서 오버헤드 발생
- 프로그램 실행 속도가 느려질 수 있음
- 객체 간 의존성 증가 (결합도 문제)
객체지향의 4대 특징
1. 캡슐화 (Encapsulation)
- 데이터(속성)와 메서드(기능)를 하나의 객체로 묶음
- 외부에서 직접 접근을 제한하고, getter / setter 를 통해 접근
- 정보 은닉(Information Hiding) 을 통해 데이터 보호
2. 상속 (Inheritance)
- 기존 클래스의 속성과 기능을 재사용 하여 새로운 클래스를 생성
- 코드 중복 감소 & 유지보수 용이
3. 추상화 (Abstraction)
- 불필요한 부분은 숨기고, 핵심적인 기능만 제공
- 추상 클래스 (abstract class) 또는 인터페이스 (interface) 사용
4. 다형성 (Polymorphism)**
- 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질(객체 지향 프로그래밍의 꽃)
- ex) 메서드 오버로딩(Method Overloading), 메서드 오버라이딩(Method Overriding)
2.클래스와 객체
클래스와 객체의 정의와 용도
"클래스"란 객체를 정의해 놓은 것으로 객체를 생성하는데 사용
"객체"는 실제로 존재하는 것(사물, 개념)을 의미하고 속성과 기능을 가짐
객체와 인스턴스
클래스로부터 객체를 만드는 과정을 인스턴스화(instantiate)라고 하며 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다
ex) TV는 객체다, TV는 TV클래스의 인스턴스다
객체의 구성요소 - 속성과 기능
속성(멤버변수, 특성, 필드, 상태)
기능(메서드, 함수, 행위)
인스턴스의 생성과 사용
클래스명 변수명;
변수명 = new 클래스명();
Tv t;
t = new Tv();
// 객체생성 + 메모리 할당 + 생성자함수 호출
참조변수 t는 Tv클래스 타입으로 선언
연산자 new에 의해 Tv클래스의 인스턴스가 메모리 빈 공간에 형성되며 객체의 주소값이 참조변수 t에 저장됨
인스턴스는 참조변수를 통해서만 다룰 수 있음(참조변수는 리모컨, 인스턴스는 TV에 비유)
참조변수 타입은 인스턴스 타입과 일치해야함
객체 배열
객체배열도 배열처럼 같은 타입의 객체만 저장 가능
다형성을 이용하면 여러 종류 객체 다룰 수 있음
3. 변수와 메서드
변수
클래스 변수(class variable)
static이 붙은 변수
모든 인스턴스가 공통된 저장공간 공유(항상 공통된 값 가짐)
인스턴스 생성하지 않고 '클래스이름.클래스변수'형식으로 사용 가능(권장됨)
클래스가 메모리에 로딩될 때 생성되고 프로그램 종료될 때 까지 유지
public이 붙으면 프로그램 내에서 어디서나 접근가능한 전역변수(global variable)의 성격 가짐
인스턴스 변수(instance variable)
클래스 영역에 선언
클래스의 인스턴스를 생성할 때 만들어짐
사용하기 위해서 인스턴스를 먼저 생성해야한다
독립적인 저장공간을 가지므로 다른 값을 유지함
지역 변수(local variable)
메서드 내에서 선언되고 메서드 내에서만 사용 가능
다른 메서드라면 같은 이름 변수 선언 가능
메서드 종료시 소멸됨
메서드
개념
재사용성, 중복된 코드 제거
메서드의 선언
메서드 선언부
[접근제어자] [반환타입] 메서드이름(타입 변수명, ...) {
// 실행 코드
return 값; // 반환타입이 void가 아닐 경우 필수
}
- 반환타입이 void가 아닐 경우 구현부에 return값 반드시 포함되어야 한다(void일 경우 컴파일러가 메서드 마지막에 'return;'을 자동적으로 추가)
- java에서 return 값은 하나만 허용한다
- return값의 타입은 반환타입과 일치하거나 적어도 자동 형변환 가능한 것이어야함
클래스 메서드(static메서드)와 인스턴스 메서드
인스턴스 메서드
- static붙은 멤버(속성, 메서드) 사용 가능
- 인스턴스 변수와 관련된 메서드 작업을 수행하며 인스턴스 변수를 필요로 한다
- 인스턴스 변수는 인스턴스 생성이 선행되야하기 때문에 인스턴스 메서드도 인스턴스 생성해야만 호출 가능하다
클래스 메서드(static 메서드)
- 인스턴스를 생성하지 않아도 사용 가능(클래스가 메모리 올라갈 때 자동적으로 생성)
- 인스턴스 변수 사용 불가(인스턴스가 없을 수 있기 때문)
4. 오버로딩(overloading)
개념
한 클래스 내에 같은 이름의 메서드 여러 개 정의하는 것
오버로딩의 조건
- 메서드 이름이 같아야 한다
- 매개변수의 개수 또는 타입이 달라야 한다
ex) println() 메서드
오버로딩의 장점
- 메서드의 이름을 절약(코드 재사용성 증가)
- 코드 가독성 향상
- 다형성의 한 형태
가변인자(varargs)
- 가변인자는 내부적으로 배열을 이용
- 메서드의 매개변수에서 가변 인자는 항상 마지막 위치
- 동일한 타입의 값들만 받을 수 있음
- 가변인자를 사용한 메서드는 오버로딩하지 않는 것 권장
5. 생성자(constructor)
생성자 개념
- 인스턴스가 생설될 때 호출되는 '인스턴스 초기화 메서드'
- 생성자의 이름은 클래스 이름과 같아야 하고 리턴 값이 없음
Card c = new Card();
- 연산자 new에 의해 메모리(heap)에 Card 클래스의 인스턴스 생성
- 생성자 Card()가 호출되어 수행됨
- 참조변수 c에 Card인스턴스 주소 저장
기본 생성자(default constructor)
- 정의된 생성자가 하나도 없을 경우 컴파일러가 기본 생성자 자동 추가해줌
- 파라미터있는 생성자가 있을 경우 기본 생성자는 자동 추가되지 않음
this(), this
this
- 인스턴스 자신을 가리키는 참조변수
- 인스턴스의 주소 저장되어 있음
this()
- 같은 클래스의 다른 생성자 호출 시 사용
- 생성자의 이름으로 this 사용
- 생성자의 첫 줄에만 다른 생성자 호출 가능
6. 변수의 초기화
개념
- 변수 선언 후 처음으로 값 저장하는 것을 '변수의 초기화'라고 함
- 멤버 변수 초기화는 선택적(선언하면 기본값으로 초기화)
- 지역변수는 사용하기 전 반드시 초기화 필수
변수의 초기화
- 같은 타입의 변수는 콤마로 함께 선언 및 초기화 가능하다(타입 다르면 불가)
- 변수가 선언되기 전에 사용 불가
멤벼변수의 초기화
명시적 초기화(explicit initialization)
변수 선언하는 동시에 초기화 하는 것 의미
초기화 블럭(initialization block)
클래스 초기화 블럭
- 클래스변수의 복잡한 초기화에 사용
- 클래스 처음 로딩될 때 한번 초기화
인스턴스 초기화 블럭
- 인스턴스변수의 복잡한 초기화에 사용
- 인스턴스 생성될 때마다 인스턴스별로 초기화