이제 슬슬 어려워집니다... 마음의 준비를 해주세요
함수
- 특정 작업을 수행하는 코드블록
- 반복적으로 사용되는 코드를 재사용 가능하게 만들어 가독성과 유지 보수성을 향상 시킴
함수의 정리
- 특정 작업을 수행하는 코드 블록에 이름을 붙인 것
- 실행 가능한 단위
- 함수의 구성 요소 : 반환타입(또는 void), 함수이름, 매개변수, 함수 내용
- return 구문은 반환 타입이 void인 경우 생략이 가능

ex) 함수의 예시
int add(int a, int b){
return a+b
}
void printHelloWorld (){
System.out.println("Hello, World!")
}
클래스(Class)
- 관련 있는 변수(필드)와 함수(메서드)를 묶어서 묶어서 만든 사용자 정의 자료형(데이터 타입)
- 객체를 생성하기 위한 설계도(Blueprint)
- 클래스를 통해 생성된 객체 -> 인스턴스(Instance)
클래스 구성 요소
- 필드(Field)
- 클래스에 선언된 변수 (멤버 변수, 멤버 필드)
- 클래스의 속성을 정의 -> 각 인스턴스는 필드에 고유한 값을 가질 수 있음
cf) 필드의 변수는 초기화를 하지 않더라도 사용할 수 있음
ex) 인스턴스 생성 -> 초기화 X-> String Null, int 0
- 메서드(Method)
- 특정한 동작을 수행하는 코드 블록(객체의 행동을 정의)
- 입력(매개변수)를 이용하여 처리하고 결과(반환 값)를 반환
- 오버로딩 가능
- 생성자(Constructor)
객체 생성 시 호출되는 특별한 메서드(필드 초기화 또는 생성시 필요한 작업 수행)
클래스 이름과 같고, 반환타입이 없음
생성자(Constructor)
- 객체 생성 시 호출되는 특별한 메서드(필드 초기화 또는 생성시 필요한 작업 수행)
- 클래스 이름과 같고, 반환타입이 없음(void 작성 X)
- new 키워드와 함께 호출하여 객체 생성
- 객체 생성 시 반드시 호출 되어야함
- 기본 생성자(매개 변수가 없음)를 자동으로 제공(생성자 미 작성 시)
- 매개변수의 개수가 다르거나, 자료형이 다른 여러개의 생성자가 있을 수 있음(생성자 오버로딩)
- 생성자의 첫번째 라인으로 this() 생성자를 사용하여 또 다른 생성자를 하나 호출 가능
기본 생성자
- 매개 변수가 없는 생성자
- 개발자가 따로 정의하지 않으면 컴파일러가 자동으로 추가
- 생성자가 하나라도 정의되어있으면 기본 생성자를 추가하지 않음
매개변수 생성자
- 매개 변수를 받아 객체를 초기화 하는 생성자
- 생성자 호출 시 인자를 넘겨주어야 함
- 작성 시 컴파일러는 기본 생성자를 작성하지 않음
생성자 오버로딩
- 같은 이름의 생성자를 매개 변수의 개수나 타입이 다르게 여러 개 정의
- 매개 변수의 타입, 개수, 순서 등이 달라야함
키워드 : this
- 매개변수 이름과 필드 이름이 같은 경우, 필드를 구분하기 위해서 사용(다르면 생략가능)
- 참조 변수로써 현재 인스턴스 자기 자신을 가리킴
- static 영역에서 사용 불가능
키워드 : this()
- 해당 키워드를 통해 같은 클래스의 다른 생성자를 호출
- 같은 클래스 내에서만 호출 가능
- 반드시 생성자의 첫번째 줄에 위치
- 중복 코드를 제거하거나, 생성자 체인을 통해 간결하고 유지보수하기 쉬운 코드 작성에 도움을 줌
객체지향 프로그래밍(OOP, Object Oriented Programming)
- 객체 : 의사나 행위가 미치는 대상, 작용의 대상 / 세상의 모든 사물, 개념(유/무형) 등
=> 현실 세계에서 식별 가능하고, 상태를 가지며, 어떤 행동의 주체 또는 대상이 되는 모든 것을 객체로 볼 수 있음
- 객체(Object) : 데이터와 관련된 알고리즘(메서드)를 하나의 단위로 묶어 놓은 것
- 객체 모델링 : 현실세계의 객체를 SW객체로 설계하는것
객체지향 프로그래밍 장점
- 모듈화 된 프로그래밍 가능
- 재사용성 증가
객체지향 프로그래밍 특징(A PIE)
1. 추상화(Abstraction)
정의 : 객체 지향 프로그래밍에서 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는 것을 말함.(복잡한 시스템 -> 핵심적인 개념 / 기능의 분리)
** JAVA에서는 주로 Abstract class와 interface로 구현됨
핵심 가치 : 복잡한 시스템을 단순화하여 설계 생산성을 높이고, 실제 구현체와 사용자가 상호작용하는 규격(인터페이스)을 분리
2. 다형성(Polymorphism)
정의 : 하나의 참조 변수가 여러 타입의 객체를 참조할 수 있거나, 동일한 이름의 메서드가 상황에 따라 다르게 동작하는 성질
** JAVA 구현 : 오버라이딩(Overriding), 오버로딩(Overloading), 그리고 부모 타입 변수로 자식 인스턴스를 참조하는 업캐스팅(Upcasting)을 통해 구현
핵심 가치 : 코드의 유연성과 확장성을 극대화하며, 구체적인 타입에 의존하지 않는 범용적인 프로그래밍을 가능하게 함.
3. 상속(Inheritance)
정의 : 이미 정의된 부모 클래스의 모든 속성과 기능을 자식 클래스가 물려받아 사용하는 것을 말함.
** JAVA에서는 extends 키워드를 사용하여 구현하는데, 실제 단일 상속만을 지원함
핵심 가치 : 기존 코드를 재사용하여 새로운 클래스를 빠르게 작성할 수 있으며, 클래스 간의 계층 구조를 형성하여 다형성의 기반이 됨
4. 캡슐화(Encapsulation)
정의 : 서로 연관된 데이터(필드)와 함수(메서드)를 하나의 단위로 묶고, 외부로부터의 직접적인 접근을 제한
** JAVA에서는 private, protected, public 같은 접근 제어자를 활용하며, Getter / Setter메서드를 통해 데이터 접근
