객체지향 프로그래밍이란?
- 현대 컴퓨터 프로그래밍 패러다임의 하나
- 컴퓨터 프로그램을 여러 개의 독립된 단위(객체)들의 모임으로 파악
특징
- 객체는 데이터와 그 데이터를 처리할 수 있는 메서드를 갖는다
- 소프트웨어의 부품화, 재사용을 주요 목표로 함
- 코드의 재사용성이 높다
- 코드의 관리가 쉬워짐 : 개발과 유지보수에 강점, 직관적 코드 분석을 가능하게 함
- 신뢰도 높은 프로그램 개발을 가능하게 함
객체의 정의
- 실세계에 존재하는 것, 사물 또는 개념
- 객체는 정보를 효율적으로 관리하기 위해 의미를 부여하고 분류하는 논리적 단위
- 객체는 다른 객체와 서로 상호작용하면서 동작한다
객체의 구성 요소
- 객체는 속성(정보)과 동작(기능)의 집합 -> 객체의 멤버(member: 구성요소)라 함
- 속성은 필드(field), 동작은 메서드(method)로 정의
클래스
- 객체를 정의해 놓은 것
- 객체를 생성하는데 사용되는 설계도
객체(Object)는 인스턴스(Instance)의 일반적 의미
- 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부른다
- 인스턴스 (instance): 객체가 메모리에 할당되어 실제 사용될 때
- 인스턴스화 (instantiate): 클래스로부터 인스턴스를 생성하는 것
- 인스턴스는 하나의 클래스를 복제해서 서로다른 데이터의 값과 서로같은 메소드를 메소드를 가진 복제본을 만드는 것이다
객체지향 네 가지 특성
상속성 (Inheritance)
- 이미 만든 객체와 비슷하지만 필드와 메서드가 약간 차이가 나는 객체를 생성
- 기존의 클래스에서 공통된 필드와 메서드를 상속(재사용)
- 더 필요한 필드와 메서드를 추가
- 코드를 간결하게 하고 코드의 재사용성을 높임
최근의 추세 : 상속의 깊이는 최소화
캡슐화 (Encapsulation) - 아무나 접근 못하게 숨기는 것
객체의 실제 구현된 내용을 감추고 접근 방법만 노출하는 것
외부 객체(객체를 사용하는 쪽)에서는 객체의 내부 구조를 알지 못하며 객체가 노출하여 제공하는 필드와 메서드만 이용할 수 있음
객체 작성시 개발자는 숨겨야하는 필드와 메서드, 공개하는 필드와 메서드를 구
분하여 작성한다
캡슐화하는 이유는 외부의 잘못된 사용(의도/실수) 으로 객체(내부데이터)가 손상되는 것을 피하기 위함
접근 제한자(Access Modifier)를 사용하여 객체의 필드와 메서드의 사용 범위를 제한한다
-> 정보 은닉
다형성 (Polymorphism)
Java 객체지향에서 가장 중요한 개념
하나의 메서드나 클래스를 다양한 구현으로 사용 가능하게 하는 개념
오버로드(Overload)와 오버라이드(Override)를 통해 다형성을 구현
오버로드 : 초과적재
double sum(num1 + num2 )
double sum(num1 + num2 + num3)
오버라이드
클래스
, class는 서로 연관된 변수와 메소드를 그루핑하고 이름을 붙인것이다.
- 객체를 정의해 놓은 것, 객체를 생성하는데 사용되는 설계도
클래스의 구조 : 필드 + 메서드 + 생성자
필드 (Field)
객체의 데이터, 상태를 저장하는 변수. 주로 기본 타입 또는 참조 타입으로 정의
멤버 변수라고도 함
메서드 (Method)
- 서로 연관된 코드를 그룹핑하여 이름을 붙인 정리정돈의 상자- by 이고잉 / 생활코딩
- 객체의 기능 또는 행동을 정의
메서드 정의 방법
반드시 return 타입과 같은 타입을 return해야 한다.
메서드 호출 방법
메서드 인자 - 매개변수(parameter)
메서드를 선언할 때 괄호 안에 표현된 Input 값을 나타내는 변수 (type1 name1, type2
name2, …)
메서드 호출에서 들어가는 구체적인 값은 인자(Argument)라고 함
반환타입(return type)
메서드는 0개 혹은 1개의 값을 Output으로 반환할 수 있음
반환 값이 없을 때: void
반환 값이 있을 때: int, boolean, Goods, …
반환 되는 값은 메서드 선언에서 정의된 반환 타입과 일치해야 함
메서드 이름
자바의 식별자 규칙 대/소문자, 숫자, _, $ 조합하여 지을 수 있고 숫자로 시작할 수 없다.
관례에 따라 소문자로 작성하고 두 단어가 조합될 경우 두 번째 시작문자는 대문자로 짓는
다.
메서드 명은 기능을 쉽게 알 수 있도록 작성하는 것이 좋다. 길어져도 괜찮다.
가변 인수
메소드의 매개 변수의 개수를 알 수 없을 때 사용
가장 간단한 해결방법은 매개변수를 배열로 선언하는 것
double sum(double[] values) { }
이러한 경우, 메소드 호출시 배열을 넘겨주어 여러 개의 값을 전달할 수 있다
double[] numbers= { 1, 2, 3, 4, 5 };
double result = sum(numbers);
double result = sum(new double[] { 1, 2, 3, 4, 5 });
방법 2: 매개 변수를 … 를 이용하여 선언. 자동으로 배열이 생성되고 매개값으로 사용된다
double sum(double ... values) { }
double result = sum(1, 2, 3, 4, 5 );
Getter, Setter
일반적으로 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
객체의 외부에서 객체 내부의 데이터를 마음대로 읽고 쓸 경우 데이터의 무결성을 보장하기 힘들기 때문이다.
메소드를 통한 접근을 하게 되면 객체의 데이터를 변경할 경우 무결성 체크를 할수 있다.
private String name;
pivate int price;
String getName(string name, int price) {
this.name = name; this.price= price; }
✓ 클래스를 정의할 때 필드는 private로 하여 객체 내부의 정보를 보호하고(정보은닉) 필드에 대한 Setter와 Getter를 두어 객체의 값을 변경하고 참조하는 것이 좋다.
– 외부에서 읽기만 가능하게 하기 위해선 Getter만 해당 필드에 대해서만 작성하면 된다.
– 외부에서 쓰기만 가능하게 하기 위해선 Setter만 해당 필드에 대해서만 작성하면 된다.
– Getter와 Setter가 없으면 객체 내부 전용 변수가 된다.
생성자 (Constructor)
new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되고 객체의 초기화를 담당 한다.
생성자를 실행 시키지 않고 클래스로부터 객체를 만들 수 없다.
생성자가 성공적으로 실행되면 JVM의 Heap영역에 객체가 생성되고 객체의 참조 값이 참조변수에 저장된다.
몇 가지 조건을 제외하면 메소드와 같다.
모든 클래스에는 반드시 하나 이상의 생성자가 있어야 한다.
생성자의 정의
생성자의 이름은 클래스와 같아야 한다
생성자의 리턴 값은 없다. (하지만 void를 쓰지 않는다) -> void를 쓰면 메서드가 되버림
생성자를 안만들었으면 javac가 기본 생성자를 집어넣는다.
사용자가 임의로 생성자를 만들었다면, javac는 기본생성자를 추가하지 않는다.
public class Goods {
// 필드 선언
private String name;
private int price;
// 생성자 규칙
// 1. 클래스 이름과 동일, 반환타입 없음.
// 2. 생성자를 하나도 만들지 않으면, -> javacr가 기본 생성자를 추가한다.
// 3. 생성자를 임의로 만들었을 때 > javac가 시본 생성자를 추가하지 않음.
public Goods(String name) { // name 필드만 초기화하는 생성자
this.name = name;
}
public Goods(String name, int price) {
this(name); // 내부의 다른 생성자를 호출 할 수 있다.
this.price = price;
}
method overloading
하나의 클래스에 같은 이름의 메서드가 여러 개 존재할 수 있다
각 메소드 들은 매개변수 타입, 개수, 그리고 순서가 다른 형태로 구별된다
메소드 시그니처(Signature) : 메소드 인자의 타입, 개수, 순서
public class Song {
private String title;
private String artist;
private String album;
private String composer;
private int year;
private int track;
public Song(String title, String artist, String album, String composer, int year, int track) {
this(title, artist);
this.album = album;
this.composer = composer;
this.year = year;
this.track = track;
}
public Song(String title, String artist) {
this.title = title;
this.artist = artist;
}
}
'JAVA' 카테고리의 다른 글
JAVA 추상클래스-인터페이스 정리 / 예외 / API (0) | 2021.08.11 |
---|---|
JAVA 변수 / 패키지 / 상속 (0) | 2021.08.11 |
JAVA 참조타입 / 배열 / jar (0) | 2021.08.11 |
JAVA 조건제어문 if / else , 반복문 while, for (0) | 2021.08.11 |
JAVA 연산자/ 연산식 / github pull / 콘솔 입 출력 (0) | 2021.08.11 |