1. 객체지향언어
✔️ 객체 지향 프로그래밍
- 객체 지향 프로그래밍은 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다. (협력)
- 객체 지향 프로그래밍은 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
✔️ 특징
- 코드의 재사용성이 높다.
- 코드의 관리가 용이하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.(캡슐화)
✔️ 핵심개념
- 캡슐화
- 상속
- 추상화
- 다형성
자바 언어
- 자바 언어의 다형성을 활용
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리
- 객체 설계시 역할(인터페이스)을 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기
자바 언어의 다형성
- 오버라이딩을 떠올려보자.
- 오버라이딩 된 메서드가 실행
- 다형성으로 인터페이스를 구현한 객체를 실행 시점에 유연하게 변경할 수 있다.
- 물론 클래스 상속 관계도 다형성, 오버라이딩 적용가능
다형성의 본질
- 인터페이스를 구현한 객체 인스턴스를 실행 시점에 유연하게 변경할 수 있다.
- 다형성의 본질을 이해하려면 협력이라는 객체 사이의 관계에서 시작해야함.
- 클라이언트를 변경하지 않고, 서버의 구현 기능을 유연하게 변경할 수 있다.
2. 클래스와 객체
✔️ 클래스
- 정의: 클래스란 객체를 정의해 놓은 것이다.
- 용도: 클래스는 객체를 생성하는데 사용된다.
✔️ 객체
- 정의: 실제로 존재하는 것. 사물 또는 개념
- 용도: 객체가 가지고 있는 기능과 속성에 따라 다름
✔️ 객체와 인스턴스
- 인스턴스화: 클래스로 객체를 생성하는 과정
- 인스턴스 (객체): 특정 클래스로 생성된 객체
✔️ 속성과 기능
객체의 구성요소가 속성과 기능이다.
- 속성(property) -> 멤버변수(member variable) ,특성(attribute) ,필드(field), 상태(state)
- 기능(function) -> 메서드(method), 함수(function), 행위(behavior)
✔️ 인스턴스의 생성과 사용
class Tv {
// Tv의 속성(멤버변수)
String color; // 색상
boolean power; // 전원상태(on/off)
int channel; // 채널
// Tv의 기능(메서드)
void power() { power = !power; } // TV를 켜거나 끄는 기능을 하는 메서드
void channelUp() { ++channel; } // TV의 채널을 높이는 기능을 하는 메서드
void channelDown() { --channel; } // TV의 채널을 낮추는 기능을 하는 메서드
}
class Tv2 {
public static void main(String args[]) {
Tv t1 = new Tv(); // Tv t1; t1 = new Tv();를 한 문장으로 가능
Tv t2 = new Tv();
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
t1.channel = 7; // channel 값을 7으로 한다.
System.out.println("t1의 channel값을 7로 변경하였습니다.");
System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
}
}
Tv2 클래스에서 Tv 객체를 생성한 뒤 사용한다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
3. 변수와 메서드
✔️ 변수
class variables {
int iv;
static int cv;
void method()
{
int lv = 0;
}
}
변수의 종류 | 선언위치 | 생성시기 |
클래스 변수 (cv) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
인스턴스 변수 (iv) | 인스턴스 생성시 | |
지역 변수 (lv) | 메서드 영역 | 변수 선언문 수행시 |
인스턴스 변수
- 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.
- 인스턴스마다 고유한 상태를 유지해야하는 속성인 경우 사용한다.
클래스 변수
- 멤버변수 중 static(선언)이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수이다.
- 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 된다.
- 전역변수의 성격을 가진다.
지역 변수
- 메서드가 종료되면 소멸되어 사용할 수 없다.
인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다.
✔️ 메서드
특정 작업을 수행하는 일련의 문장들을 (작업 단위로) 하나로 묶은 것이다.
메서드를 사용하는 이유
- 높은 재사용성 (reusability)
- 중복된 코드의 제거
- 프로그램의 구조화
반환 타입
- 반환값이 없는 경우 'void'를 적어야한다.
static 메서드
- 객체 생성 없이 호출이 가능하다.
✔️ JVM의 메모리 구조
1) 메서드 영역 (method area)
: 프로그램 실행 중 어떤 클래스가 사용되면, JVM이 해당 클래스의 파일(*.class)을 읽어서 분석하여 그 정보를 이곳에 저장한다. 이 때, 그 클래스의 클래스변수(class variable)도 이 영역에 함께 생성된다.
2) 힙 (heap)
: 인스턴스변수(instance variable)들이 생성되는 공간이다.
3) 호출스택 (call stack)
: 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다.
4. 오버로딩
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(method overloading)' 또는 간단히 오버로딩'(overloading)'이라 한다.
✔️ 조건
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
* 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.
✔️ 장점
1. 메서드를 하나의 이름으로 정의할 수 있다.
2. 메서드의 이름을 절약할 수 있다.
5. 생성자
인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다.
✔️ 수행 과정
Card c = new Card();
- 연산자 new에 의해 메모리(heap)에 Card클래스의 인스턴스가 생성된다.
- 생성자 Card()가 호출되어 수행된다.
- 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.
✔️ 기본 생성자 (default constructor)
클래스이름() { }
클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러가 기본 생성자를 자동으로 추가해준다.
* 주의
기본 생성자가 컴파일러에 의해 자동 추가 되는 경우는 '클래스 내에 정의된 생성자가 하나도 없을 때' 뿐이다.
- 매개변수가 있는 생성자 (예시)
Car c = new Car("white", "auto", 4);
✔️ this(), this
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
this()
- this()는 생성자이다.
this
- this는 참조변수이다.
- this.color = color로 메서드 안에서 사용된다면 this.color은 인스턴스 변수이고 color은 지역 변수이다.
- static메서드(클래스 메서드)에서는 인스턴스 변수를 사용할 수 없는 것처럼, this 역시 사용할 수 없다.
- 예시
Car(String color) {
door = 5l // 첫번 째 줄
Car(color, "auto", 4); // 에러1: 생성자는 첫 줄에서만 호출, 에러2: this라고 해야한다.
}
📌 Reference
- 남궁 선, 「자바의 정석」, 도우출판
반응형
'프로젝트 개발 기록 > [개발] java | spring' 카테고리의 다른 글
[Java] package와 import, 제어자 (1) | 2022.10.11 |
---|---|
[Java] 상속 (Inheritance), 오버라이딩, super, super() (0) | 2022.10.09 |
[Java] 비트연산자(bitwise operator) "& | ^ ~ << >>" (0) | 2022.07.19 |
[프로그래밍 언어] Java (0) | 2022.07.09 |
댓글