야나도 프로젝트

나도 개발자 될수있어

JAVA

JAVA 객체지향 프로그래밍 /클래스 / 메서드

jmeen 2021. 8. 11. 09:51
728x90

객체지향 프로그래밍이란?

- 현대 컴퓨터 프로그래밍 패러다임의 하나

- 컴퓨터 프로그램을 여러 개의 독립된 단위(객체)들의 모임으로 파악

특징

- 객체는 데이터와 그 데이터를 처리할 수 있는 메서드를 갖는다

- 소프트웨어의 부품화, 재사용을 주요 목표로 함

- 코드의 재사용성이 높다

- 코드의 관리가 쉬워짐 : 개발과 유지보수에 강점, 직관적 코드 분석을 가능하게 함

- 신뢰도 높은 프로그램 개발을 가능하게 함

객체의 정의

- 실세계에 존재하는 것, 사물 또는 개념

- 객체는 정보를 효율적으로 관리하기 위해 의미를 부여하고 분류하는 논리적 단위

- 객체는 다른 객체와 서로 상호작용하면서 동작한다

객체의 구성 요소

- 객체는 속성(정보)과 동작(기능)의 집합 -> 객체의 멤버(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;
	}
}