객체지향 프로그래밍의 이해
객체지향 프로그래밍(OOP; Object Oriented Programming)의 핵심 개념은 ‘실제 세계는 객체들로 구성되어 있으며, 발생하는 모든 사건들은 이 객체들 간의 상호작용을 통해 발생한다’는 전제로부터 출발한다.
즉, 사물의 속성(state)과 기능(behavior)을 분석한 후에 프로그래밍 변수와 함수로 정의함으로 실제 세계를 최대한 컴퓨터 프로그래밍에 반영하고자 하는 시도라 설명할 수 있다.
객체지향 프로그래밍의 장점
기존 코드를 활용해서 새로운 코드를 상대적으로 손쉽게 작성할 수 있고, 쉽게 코드를 변경할 수 있다.
즉, 프로그램 개발 및 유지 보수에 드는 비용과 시간이 줄어들며 데이터를 손실 없이 관리하기에 용이하다.
Chapter 1. 클래스와 객체
학습 목표
- 객체지향 프로그래밍의 가장 기본적인 토대인 객체를 이해할 수 있다.
- 객체를 만드는 데 필요한 클래스의 개념을 이해하고, 그 구성요소와 기본 문법을 설명할 수 있다.
- 객체의 두 가지 구성 요소, 속성과 기능이 무엇인지 이해할 수 있다.
- 클래스에 기반하여 new 키워드를 통해 객체를 생성하고, 이를 활용할 수 있다.
- 클래스와 객체의 차이에 대해 설명하고, 둘의 관계를 정의할 수 있다.
클래스(Class)
객체를 정의한 ‘설계도’ 또는 ‘틀’이라고 정의할 수 있다.
클래스는 객체를 생성하는데 사용되며 반대로 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다.
이렇게 클래스를 통해 생성된 객체를 ‘인스턴스’라고 부르며 이런 과정을 ‘인스턴스화’라고 지칭한다.
클래스의 구성 요소와 기본 문법
class 키워드를 사용하며 클래스명은 주로 대문자로 시작하는 것이 관례이다.
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
필드 : 클래스의 속성을 나타내는 변수
메서드 : 클래스의 기능을 나타내는 함수
생성자 : 클래스의 객체를 생성하는 역할
이너 클래스 : 클래스 내부의 클래스
이 때, 생성자를 제외한 나머지 3가지 요소를 클래스의 멤버(member)라고 한다.
객체(Object)
속성과 기능이라는 두 가지 구성요소로 이루어져 있다.
객체의 생성
new 키워드를 사용하여 객체를 생성할 수 있고 포인트 연산자(.)를 통해 접근이 가능하다.
클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
참조 변수는 실제 데이터가 위치해있는 힙 메모리의 주소를 저장하는 변수를 의미한다.
따라서 new 키워드와 생성자를 통해 객체를 생성한다는 것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.
public class CarTest {
public static void main(String[] args) {
Car tesla = new Car("Model 3", "빨강"); // 객체 생성.
System.out.println("내 차의 모델은 " + tesla.model + "이고 " + "색은 " + tesla.color + "입니다."); // 필드 호출
tesla.power(); // 메서드 호출
tesla.accelerate();
tesla.stop();
}
}
class Car {
public String model; // 필드 선언
public String color;
public Car(String model, String color) { // 인스턴스 초기화를 위한 생성자 함수. 이후 챕터에서 학습 예정.
this.model = model;
this.color = color;
}
void power() { // 메서드 선언
System.out.println("시동을 걸었습니다.");
}
void accelerate() {
System.out.println("더 빠르게!");
}
void stop(){
System.out.println("멈춰!!");
}
}
// 출력값
내 차의 모델은 Model 3이고 색은 빨강입니다.
시동을 걸었습니다.
더 빠르게!
멈춰!!
Chapter 2. 필드(Field)와 메서드(Method)
학습 목표
- 객체의 속성을 정의하는 필드를 이해하고, 세 가지 종류의 변수를 구분할 수 있다.
- 각각의 변수가 저장되는 위치를 설명하고, 그 차이를 설명할 수 있다.
- static 키워드가 무엇이며, 언제 사용되는 지 설명할 수 있다.
- 객체의 기능을 정의하는 메서드를 이해하고, 메서드의 구성요소와 호출에 대해 설명할 수 있다.
- 메서드 오버로딩을 이해하고 그 장점을 설명할 수 있다.
필드(Field)
‘클래스에 포함된 변수’를 의미하는 것으로 객체의 속성을 정의할 때 사용된다.
자바에서 변수는 **클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 지역 변수(lv, local variable)**로 구분된다.
이 중에섯 필드라 부른 것은 클래스 변수와 인스턴스 변수이며 static 키워드가 함께 선언되면 클래스 변수, 그렇지 않은 것은 인스턴스 변수이다.
지역 변수란 이 두 가지 변수 유형에 포함되지 않고 메서드 내에 선언된 모든 변수를 의미한다.
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
클래스 변수는 공통된 저장공간을 공유하기 때문에 모든 인스턴스들이 특정한 값을 공유하는 경우에 선언한다.
또한, 인스턴스를 따로 생성하지 않아도 클래스명.클래스변수명을 통해 사용이 가능하다.
지역 변수는 스택 메모리에 저장되어 메서드가 종료됨과 동시에 소멸되어 사용할 수 없게 된다.
힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되지 않는 반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 자동으로 삭제된다.
힙 메모리에는 빈 공간이 저장될 수 없기에 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언 시 반드시 초기화를 실행해주어야 한다.
메서드(Method)
특정 작업을 수행하는 일련의 명령문들의 집합을 의미한다.
메서드는 메서드 시그니처와 몸통에 해당하는 메서드 바디로 구분할 수 있다.
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
메서드 시그니처는 반환타입, 메서드명(관례적으로 소문자로 표시), 매개변수를 포함한다.
메서드 바디는 메서드가 호출되었을 때 수행되어야 하는 작업들을 표시하게 된다.
반환타입이 void가 아닌 경우에는 반드시 return문이 존재해야 하며 return되는 결과값은 반드시 반환타입과 일치해야 한다.
메서드의 호출
클래스 외부에서 메서드를 사용하기 위해서는 인스턴스를 생성해야 한다.
클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 호출이 가능하다.
메서드 오버로딩(Method Overloading)
하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미한다.
오버로딩이 성립하기 위해서는 같은 이름의 메서드명을 사용해야 하고, 매개변수의 개수 혹은 타입이 다르게 정의되어야 한다.
이 조건이 성립되지 않은 상태로 같은 이름의 메서드명을 사용하면 컴파일 에러가 발생하게 된다.
오버로딩의 장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 것이다.
예를 들어 매개변수를 받아 그대로 출력하는 메서드를 작성할 때
오버로딩을 사용하지 않는 경우 아래와 같이 같은 동작의 메서드를 여러 개 작성해야 한다.
static void print1(String a) {
System.out.println(a);
}
static void print2(int a) {
System.out.println(a);
}
static double print3(double a) {
System.out.println(a);
}
오버로딩을 사용하는경우
static void print(String a) {
System.out.println(a);
}
static void print(int a) {
System.out.println(a);
}
static void print(double a) {
System.out.println(a);
}
1번의 경우 매개변수에 따라 메서드를 다르게 사용해야 하지만 2번의 경우 사용하는 매개변수의 타입에 상관 없이 print메서드로 사용이 가능하다.
객체지향 프로그래밍의 이해
객체지향 프로그래밍(OOP; Object Oriented Programming)의 핵심 개념은 ‘실제 세계는 객체들로 구성되어 있으며, 발생하는 모든 사건들은 이 객체들 간의 상호작용을 통해 발생한다’는 전제로부터 출발한다.
즉, 사물의 속성(state)과 기능(behavior)을 분석한 후에 프로그래밍 변수와 함수로 정의함으로 실제 세계를 최대한 컴퓨터 프로그래밍에 반영하고자 하는 시도라 설명할 수 있다.
객체지향 프로그래밍의 장점
기존 코드를 활용해서 새로운 코드를 상대적으로 손쉽게 작성할 수 있고, 쉽게 코드를 변경할 수 있다.
즉, 프로그램 개발 및 유지 보수에 드는 비용과 시간이 줄어들며 데이터를 손실 없이 관리하기에 용이하다.
Chapter 1. 클래스와 객체
학습 목표
- 객체지향 프로그래밍의 가장 기본적인 토대인 객체를 이해할 수 있다.
- 객체를 만드는 데 필요한 클래스의 개념을 이해하고, 그 구성요소와 기본 문법을 설명할 수 있다.
- 객체의 두 가지 구성 요소, 속성과 기능이 무엇인지 이해할 수 있다.
- 클래스에 기반하여 new 키워드를 통해 객체를 생성하고, 이를 활용할 수 있다.
- 클래스와 객체의 차이에 대해 설명하고, 둘의 관계를 정의할 수 있다.
클래스(Class)
객체를 정의한 ‘설계도’ 또는 ‘틀’이라고 정의할 수 있다.
클래스는 객체를 생성하는데 사용되며 반대로 객체는 클래스에 정의되고 설계된 내용 그대로 생성된다.
이렇게 클래스를 통해 생성된 객체를 ‘인스턴스’라고 부르며 이런 과정을 ‘인스턴스화’라고 지칭한다.
클래스의 구성 요소와 기본 문법
class 키워드를 사용하며 클래스명은 주로 대문자로 시작하는 것이 관례이다.
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
필드 : 클래스의 속성을 나타내는 변수
메서드 : 클래스의 기능을 나타내는 함수
생성자 : 클래스의 객체를 생성하는 역할
이너 클래스 : 클래스 내부의 클래스
이 때, 생성자를 제외한 나머지 3가지 요소를 클래스의 **멤버(member)**라고 한다.
객체(Object)
속성과 기능이라는 두 가지 구성요소로 이루어져 있다.
객체의 생성
new 키워드를 사용하여 객체를 생성할 수 있고 포인트 연산자(.)를 통해 접근이 가능하다.
클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
참조 변수는 실제 데이터가 위치해있는 힙 메모리의 주소를 저장하는 변수를 의미한다.
따라서 new 키워드와 생성자를 통해 객체를 생성한다는 것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조변수에 저장하는 것과 같다.
public class CarTest {
public static void main(String[] args) {
Car tesla = new Car("Model 3", "빨강"); // 객체 생성.
System.out.println("내 차의 모델은 " + tesla.model + "이고 " + "색은 " + tesla.color + "입니다."); // 필드 호출
tesla.power(); // 메서드 호출
tesla.accelerate();
tesla.stop();
}
}
class Car {
public String model; // 필드 선언
public String color;
public Car(String model, String color) { // 인스턴스 초기화를 위한 생성자 함수. 이후 챕터에서 학습 예정.
this.model = model;
this.color = color;
}
void power() { // 메서드 선언
System.out.println("시동을 걸었습니다.");
}
void accelerate() {
System.out.println("더 빠르게!");
}
void stop(){
System.out.println("멈춰!!");
}
}
// 출력값
내 차의 모델은 Model 3이고 색은 빨강입니다.
시동을 걸었습니다.
더 빠르게!
멈춰!!
Chapter 2. 필드(Field)와 메서드(Method)
학습 목표
- 객체의 속성을 정의하는 필드를 이해하고, 세 가지 종류의 변수를 구분할 수 있다.
- 각각의 변수가 저장되는 위치를 설명하고, 그 차이를 설명할 수 있다.
- static 키워드가 무엇이며, 언제 사용되는 지 설명할 수 있다.
- 객체의 기능을 정의하는 메서드를 이해하고, 메서드의 구성요소와 호출에 대해 설명할 수 있다.
- 메서드 오버로딩을 이해하고 그 장점을 설명할 수 있다.
필드(Field)
‘클래스에 포함된 변수’를 의미하는 것으로 객체의 속성을 정의할 때 사용된다.
자바에서 변수는 **클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 지역 변수(lv, local variable)**로 구분된다.
이 중에섯 필드라 부른 것은 클래스 변수와 인스턴스 변수이며 static 키워드가 함께 선언되면 클래스 변수, 그렇지 않은 것은 인스턴스 변수이다.
지역 변수란 이 두 가지 변수 유형에 포함되지 않고 메서드 내에 선언된 모든 변수를 의미한다.
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
클래스 변수는 공통된 저장공간을 공유하기 때문에 모든 인스턴스들이 특정한 값을 공유하는 경우에 선언한다.
또한, 인스턴스를 따로 생성하지 않아도 클래스명.클래스변수명을 통해 사용이 가능하다.
지역 변수는 스택 메모리에 저장되어 메서드가 종료됨과 동시에 소멸되어 사용할 수 없게 된다.
힙 메모리에 저장되는 필드 변수는 객체가 없어지지 않는 한 절대로 삭제되지 않는 반면, 스택 메모리에 저장되는 지역변수는 한동안 사용되지 않는 경우 자동으로 삭제된다.
힙 메모리에는 빈 공간이 저장될 수 없기에 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언 시 반드시 초기화를 실행해주어야 한다.
메서드(Method)
특정 작업을 수행하는 일련의 명령문들의 집합을 의미한다.
메서드는 메서드 시그니처와 몸통에 해당하는 메서드 바디로 구분할 수 있다.
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
메서드 시그니처는 반환타입, 메서드명(관례적으로 소문자로 표시), 매개변수를 포함한다.
메서드 바디는 메서드가 호출되었을 때 수행되어야 하는 작업들을 표시하게 된다.
반환타입이 void가 아닌 경우에는 반드시 return문이 존재해야 하며 return되는 결과값은 반드시 반환타입과 일치해야 한다.
메서드의 호출
클래스 외부에서 메서드를 사용하기 위해서는 인스턴스를 생성해야 한다.
클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 호출이 가능하다.
메서드 오버로딩(Method Overloading)
하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미한다.
오버로딩이 성립하기 위해서는 같은 이름의 메서드명을 사용해야 하고, 매개변수의 개수 혹은 타입이 다르게 정의되어야 한다.
이 조건이 성립되지 않은 상태로 같은 이름의 메서드명을 사용하면 컴파일 에러가 발생하게 된다.
오버로딩의 장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 것이다.
예를 들어 매개변수를 받아 그대로 출력하는 메서드를 작성할 때
오버로딩을 사용하지 않는 경우 아래와 같이 같은 동작의 메서드를 여러 개 작성해야 한다.
static void print1(String a) {
System.out.println(a);
}
static void print2(int a) {
System.out.println(a);
}
static double print3(double a) {
System.out.println(a);
}
오버로딩을 사용하는경우
static void print(String a) {
System.out.println(a);
}
static void print(int a) {
System.out.println(a);
}
static void print(double a) {
System.out.println(a);
}
1번의 경우 매개변수에 따라 메서드를 다르게 사용해야 하지만 2번의 경우 사용하는 매개변수의 타입에 상관 없이 print메서드로 사용이 가능하다.
'CodeStates_BE_44 > TIL' 카테고리의 다른 글
Day 11. [Java] 객체지향 프로그래밍 심화_상속, 캡슐화 (0) | 2023.02.27 |
---|---|
Day 10. [Java] 객체지향 프로그래밍 기초_생성자, 내부 클래스 (0) | 2023.02.24 |
Day 7. [Java] 반복문 (0) | 2023.02.21 |
Day 6. [Java] 연산자, 콘솔 입출력, 조건문 (0) | 2023.02.20 |
Day 5. [Java] 변수와 타입, 문자열 (0) | 2023.02.20 |