1. 객체 지향 프로그래밍 (OOP : Object Oriented Programming)
: 모든 데이터를 객체(object)로 취급하며, 하나씩 조립해서 완성된 프로그램을 만드는 기법
-객체(Object)
: 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다.

예를 들어 사람의 속성으로는 이름, 나이가 있고 동작으로는 웃다, 먹다, 걷다 등의 동작이 있는데 이 속성과 동작들을 각각 필드(field)와 메소드(method)라고 부른다.
※ 객체 지향 프로그램의 특징
: 캡슐화, 상속, 다형성
-캡슐화(Encapsulation)
: 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것으로 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
-> 접근 제한자(Access Modifier)를 사용하여 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정한다.

-상속(Inheritance)
: 객체 지향 프로그래밍에는 부모 역할의 상위 객체와 자식 역할의 하위 객체가 있다. 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해주는 것을 상속이라 한다.

-> 자식 객체 즉, 하위 객체가 상위 객체를 상속 받았다면 상위 객체 수정으로 모든 하위 객체들의 수정 효과를 가져오므로 유지 보수 시간을 최소화시켜주기도 한다.
-다형성(Polymorphism)
: 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 다형성이라 한다.
2. 클래스
: 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다. 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있으며 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.
/* 클래스의 구성 멤버 */
public class ClassName {
// 필드
int fieldName;
// 생성자
ClassName() {
/* .... */
}
// 메소드
void methodName() {
/* .... */
}
}
-필드(field)
: 객체의 데이터(고유 데이터, 부품 객체, 상태 정보)가 저장되는 곳으로 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.
※선언 형태는 변수(variable)와 비슷하지만 변수라고는 부르지 않는다.
/* Car 클래스 필드 선언 */
public class Car {
// 필드
String company = "현대";
String model = "그랜저";
String color = "검정";
int maxSpeed = 350;
int speed;
}
/* 외부 클래스에서 Car 필드값 읽기와 변경 */
public classs CarExample {
public static void main(String[] args) {
// 객체 생성
Car myCar = new Car();
// 필드값 읽기
System.out.println("제작회사: " + myCar.company); // 제작회사: 현대자동차 출력
System.out.println("최고속도: " + myCar.maxSpeed); // 최고속도: 350 출력
// 필드값 변경
myCar.speed = 60;
}
}
-생성자(constructor)
: new 연산자로 호출되는 특별한 중괄호 {} 블록으로 객체 생성 시 초기화를 담당한다.
/* 생성자 선언 */
public class Car {
// 생성자
Car(String color, int cc) {
}
}
/* 생성자 호출 후 객체 생성 */
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car("검정", 3000);
// Car myCar = new Car(); -> 기본 생성자 호출 불가
}
}
※생성자 오버로딩(Overloading)
: 매개 변수를 달리하는 생성자를 여러개 선언하는 것
public class Car {
Car(String model) { ... }
Car(String model, String color) { ... }
Car(String color, String model) { ... } // 위의 생성자와 오버로딩이 아님
}
-> 생성자의 이름은 같으나 매개 변수의 타입, 개수, 순서가 다르게 선언하면 오버로딩이라고 하지만 매개 변수의 타입과 개수, 선언된 순서가 같을 때 매개 변수 이름만 바꾸는 것은 오버로딩이라고 할 수 없다.
-this()
: 자신의 다른 생성자를 호출하는 코드로 생성자 내부에서만 사용할 수 있으며, this()의 매개값은 호출되는 생성자의 매개 변수 타입에 맞게 제공해야 한다.
-메소드(method)
: 객체의 동작에 해당하는 중괄호 {} 블록으로, 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다.
-메소드 선언
: 선언부(리턴타입, 메소드이름, 매개변수선언)와 실행 블록으로 구성된다.
리턴타입 메소드 이름 ( [매개변수선언, ...] ) {
실행할 코드를 작성하는 곳
}
*리턴타입
: 메소드가 실행 후 리턴하는 값의 타입을 말하며 리턴타입은 있을 수도 있고 없을 수도 있다. 메소드가 실행 후 결과를 호출한곳에 넘겨줄 경우에는 리턴값이 있어야 한다.
void powerOn() { ... } // 리턴값이 없는 메소드
double divide(int x, int y) { ... } // 리턴값이 있는 메소드
/* 메소드 호출 */
powerOn();
double result = divide(10, 20); // 리턴값을 변수에 저장하는 호출 방법
divide(10, 20); // 변수 선언 없이 메소드 호출 방법
int result = divide(10, 20); // 컴파일 에러
※메소드 오버로딩(Overloading)
: 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
public class Calculator {
// 정사각형 넓이
double areaRectangle(double width) {
return width * width;
}
// 직사각형 넓이
double areaRectangle(double width, double height) {
return width * height;
}
}
- 메소드의 이름은 같아야 한다.
- 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 한다.
-> 두 가지 조건을 만족해야 한다.
-this 참조 변수
: 인스턴스(instance)가 자기 자신을 참조하는데 사용하는 변수이며, this 참조 변수는 해당 인스턴스의 주소를 가리킨다.
-final 필드
: 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다.
final필드는 객체마다 저장되고, 생성자의 매개값을 통해 여러 가지 값을 가질 수 있다.
final String nation = "Korea";
*final 필드의 초기값을 줄 수 있는 방법
- 필드 선언 시에 주는 방법
- 생성자에서 주는 방법
-상수(static final)
: 객체마다 저장되지 않고, 클래스에만 포함된다. 떠한 초기값이 한 번 저장되면 변경할 수 없다.
static final double PI = 3.14159;
'Programming > JAVA' 카테고리의 다른 글
자바 상속의 개념 (0) | 2020.01.03 |
---|---|
자바의 접근 제한자 (0) | 2019.12.30 |
자바의 참조 타입과 배열 (0) | 2019.12.23 |
BufferedReader, BufferedWriter를 이용한 빠른 입출력 (0) | 2019.12.20 |
자바의 제어문 (조건문과 반복문) (0) | 2019.12.19 |