2020년 10월 16일
업데이트:
OOP(Object Oriented Programming)
객체 지향 언어
객체지향 프로그래밍 : 현실 세계의 개체(Entity)를 기계의 부품처럼 하나의 객체로 만들어, 기계적인 부품들을 조립하여 제품을 만들 듯이 소프트웨어를 개발할 때도 객체들을 조립해서 프로그램을 작성할 수 있도록 한 프로그래밍 기법이다.
- 객체지향 언어의 특징
- 캡슐화(Encapsulation)
- 상속(Inheritance)
- 다형성(Polymorphism)
- 추상화(Abstraction)
-
현실에서 객체란?
자신의 속성(값, data)과 기능(동작, 행동)이 다른 것들과 구분되어 식별 가능한 것 -
객체 지향 언어란?
현실 세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있으며 발생하는 모든 사건들은객체 간의 상호작용
이다. 이 개념을 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다. - 자바에서 객체란?
클래스에 정의된 내용대로new 연산자
를 통해 메모리 영역에 생성된 것을 말한다.
클래스(Class)
두 개 이상의 유사한 객체들을 묶어서 하나의 공통된 특성을 표현하는 요소이며 객체의 유형 또는 타입을 의미한다. 즉, 객체의 특성(속성, 기능)에 대해 정의한다.
- 클래스 필수 요소
추상화
와캡슐화
가 적용되어야 한다.
추상화(Abstraction)
불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것, 즉 모델화하는 것이다.
국민의 정보를 추상화하여 클래스 다이어그램
으로 표현 시 다음과 같다.
접근제어자 | 표현법 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
public | + | |||||||||||||||
private | - | |||||||||||||||
protected | # | |||||||||||||||
package | ~ |
캡슐화
데이터(속성)와 데이터를 처리하는 함수를 하나로 묶는 것을 의미한다. 캡슐화된 객체의 세부 내용이 외부에 은폐(정보 은닉)되어, 변경이 발생할 때 오류의 파급효과가 적다.
- 캡슐화의 원칙
- 클래스의
멤버 변수
에 대한 접근 권한은private
을 원칙으로 한다. - 클래스의 멤버 변수에 대한 연산 처리를 목적으로 하는 멤버 메소드는 클래스 내부에 작성
멤버 메소드
는 클래스 밖에서 접근할 수 있도록public
으로 작성
- 클래스의
public class Account {
// VO(Value Object) : 값을 취급하는 객체
// 속성 정의
// 이름, 계좌번호, 비밀번호, 은행코드, 잔액
// 캡슐화 : 속성, 기능을 묶고, 외부로부터 멤버 변수에 직접 접근하는 것을 차단
// -> 부가 효과로 정보 은닉 발생
// 멤버 변수
// public : 누구나 어디서든 접근 가능
// private : 같은 클래스(객체) 내에서만 접근이 가능함
private String name = "이한솔";
private String accountNumber - "123-45-6789";
private int password = 1234;
private String bankCode = "002";
private int balance = 100000;
// 기능 정의
// private으로 외부 직접 접근이 제한된 멤버 변수에 간접 접근이
// 가능하도록하는 메소드(기능) 생성
// == setter / getter
// name의 setter
public void setName(String name){
// 매개변수, 전달인자, 파라미터 == 외부로부터 전달 받은 값
this.name = name;
// this : 현재 객체
}
// getter 작성 규칙
// public 멤버변수자료형 get멤버변수명() {
// return 멤버변수명;
//}
// name의 getter
public String getName() {
// 반환형 : 메소드가 호출된 후 호출된 곳으로 돌아갈 때 가지고 갈 데이터의 자료형
return name;
}
}
// 나머지 멤버 변수의 setter와 getter 생략
// setter와 getter 자동생성 단축키
// alt + shift + s -> r
필드(Field)
필드는 클래스 바로 아래 작성된 변수로, 같은 클래스 내 어디서든 접근이 가능한 변수이다.
// 표현식
[접근제한자] [예약어] class 클래스명 {
[접근제한자] [예약어] 자료형 변수명 [= 초기값];
}
기호 | 접근제한자 | 해당 클래스 내부 | 같은 패키지 내 | 후손 클래스 내 | 전체 | ||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
+ | public | O | O | O | O | ||||||||
# | protected | O | O | O | |||||||||
~ | (default) | O | O | ||||||||||
- | private | O |
필드 예약어 - static
같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며, 프로그램 시작 시에 정적 메모리(Static) 영역에 자동 할당되는 멤버에 적용
public class FieldService {
private int num1;
private static int num2;
}
// 다른 클래스에서 static 변수를 사용하는 법
FieldService.num2 = 30;
// 클래스명.static변수명
FieldService fs = new FieldService();
fs.num2 = 30;
// 위의 방법은 정상 실행되나 static 변수를 사용하는 일반적인 방법이 아님
FieldService fs2 = new FieldService();
fs2.num2 = 30;
필드 예약어 - final
하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어
public class FieldService {
private final int NUM1;
// final 예약어가 붙은 필드명은 모두 대문자로 표기
}
생성자
객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때 객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행. 생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록한다.
생성자 규칙
생성자의 선언은 메소드 선언과 유사하나 반환 값이 없으며 생성자명을 클래스명과 똑같이 지정해주어야한다.
[접근제한자] [예약어] class 클래스명 {
[접근제한자] 클래스명() {}
[접근제한자] 클래스명(매개변수) {(this).필드명 = 매개변수;}
}
기본 생성자
생성자를 작성하지 않은 경우, 클래스 사용 시 JVM에서 자동으로 기본 생성자를 생성한다.
매개변수 생성자
- 객체 생성 시 전달받은 값으로 객체를 초기화하기 위해 사용한다.
- 매개변수 생성자 작성 시 JVM이 기본 생성자를 자동으로 생성해주지 않는다.
- 상속에서 사용 시 반드시 기본 생성자를 작성한다.
- 오버로딩을 이용하여 작성
오버로딩
한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
- 조건
- 같은 메소드 이름
- 다른 매개변수의 개수 또는 다른 매개변수 타입
public class Book {
// 속성 (필드)
private String title; // 책 제목
private String author; // 저자
private String content; // 내용
private String publisher; // 출판사
private int price; // 가격
public Book() {
// 클래스 내에 생성자가 하나도 작성되지 않은 경우
// 컴파일 시 자동으로 기본 생성자가 추가됨.
System.out.println("Book() 기본 생성자로 생성됨.");
}
// 매개변수가 있는 생성자
// 객체 생성 시 전달받은 값을 객체 필드 초기화용으로 사용
// 자동 생성되지 않고, 개발자 필요에 의해 작성되는 생성자.
public Book(String title, String author, String content, String publisher, int price) {
this.title = title;
this.author = author;
this.content = content;
this.publisher = publisher;
this.price = price;
}
// 오버로딩 : 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
// 조건 1) 메소드명 동일
// 조건 2) 매개변수의 개수, 타입, 순서가 달라야 함
public Book(String title, String author, int price){
this.title = title;
this.author = author;
this.price = price;
}
public Book(String title, String author){
// 매개변수 개수 감소 (3 -> 2)
}
public Book(int price, String title, String author){
// 매개변수 순서 변경
}
/*
public Book(String content, String publisher, int price){
// 매개변수 변수명 변경 -> 에러
// -> 오버로딩 시 매개변수명은 중요하지 않음. 타입이 중요!!
}
*/
// title setter
public void setTitle(String title){
this.title = title;
}
// title getter
public String getTitle() {
return title;
}
}
// toString() 메소드 자동 추가하기
// alt + shift + s -> s
this()
생성자, 같은 클래스의 다른 생성자를 호출할 때 사용하며 반드시 첫 번째 줄에 선언해야 함.
public class Book {
public Book(String title, String author, String content, String publisher, int price) {
this.title = title;
this.author = author;
this.content = content;
this.publisher = publisher;
this.price = price;
}
public Book(String title, String author, int price){
this.title = title;
this.author = author;
this.price = price;
}
}
//위의 두 개의 생성자가 중복된 코드를 짧게 만들기.
public Book(String title, String author, String content, String publisher, int price) {
// this() 생성자
// 같은 클래스 내에서 다른 생성자를 부를 때 사용한다.
// - 이점 : 코드 길이 감소, 생성자 재사용성 증가!
this(title, author,price);
this.content = content;
this.publisher = publisher;
}
public Book(String title, String author, int price){
this.title = title;
this.author = author;
this.price = price;
}
댓글남기기