본문 바로가기
Java/Basic

객체지향의 기본 개념 정리1

by 최로이 2021. 7. 14.

1. 객체지향언어ⅰ

특징

  • 코드의 재사용성이 높다.
  • 유지보수가 용이하다.
  • 중복코드 제거에 용이하다.

핵심개념

  • 다형성
  • 상속
  • 추상화
  • 캡슐화

 

A. 클래스와 객체

클래스

  • 클래스 : 클래스는 객체를 정의해 놓은 설계도의 개념으로 객체를 생성하기 위해서 존재한다.
  • 형태 : 데이터 + 함수의 형태로 이루어져 있으며 서로 관련된 여러 데이터를 하나로 저장할 수 있는 공간.
  • 사용자 정의 타입 : 사용자가 원하는 타입을 직접 만들 수 있다.

객체

  • 객체 : 객체란 인스턴스 변수(iv)의 묶음으로, 실제로 존재하는 것. 용도는 기능과 속성에 따라 다르다.
  • 클래스에서 객체를 생성할 때를 일컬어 '인스턴스화'라고 말한다.
  • 객체 생성 방법 : 클래스명 참조변수명 = new 클래스명(); | ex) People p = new People();  
  • 객체배열 생성 방법(참조변수의 배열) : 타입[] 배열명 = new 타입[n]; (★객체배열 생성 후 반드시 객체를 생성해야 한다)

 

B. 변수의 종류

변수는 선언 위치에 따라 종류가 다르다. 영역은 크게 두 가지로 나뉘며, 클래스 영역과 메소드 영역이다.

 

클래스 영역

  • 클래스 변수(cv) 
    • 객체 생성이 필요 없다.
    • 아무때나 사용 가능하다.
    • 클래스가 메모리에 올라갈 때 생성된다.
    • 클래스 변수는 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다. 
    • 형태 : 클래스명.변수명 | ex : card.width = 50;
  • 인스턴스 변수(iv)
    • 객체를 생성해야 사용할 수 있다.
    • 객체 생성이 꼭 필요하다.
    • 인스턴스가 생성될 떄 생성 된다.
    • 인스턴스가 생성될 때마다 생성되므로 각각 다른 값으로 유지할 수 있다.
    • 형태 : 참조변수.변수명 | ex: c.kind = "spade";

▶ 클래스 변수와 인스턴스 변수의 추가 설명(카드를 예로)

객체의 속성 : 숫자, 무늬와 같은 개별속성은 인스턴스 변수(iv)로 카드의 폭, 높이와 같은 카드의 공통속성은 클래스 변수로 지정한다. 

 

메소드 영역

  • 지역 변수(lv)
    • 클래스 이외의 영역(메소드, 생성자, 초기화 블럭 내부)에서 선언된다.
    • 메소드가 종료될 때 같이 제거 종료 된다.
    • 변수 선언문이 수행했을 때 생성된다.
    • 메소드 내에 선언된 변수로메소드 영역이 서로 다른 지역변수들은 지역변수명이 같아도 상관없다.

 

C. 메소드(함수)

특징

  • 메소드는 문장의 집합으로 이 집합은 문장들을 작업단위로 묶어서 명칭을 붙인 것을 의미한다.
  • 값(입력)을 받아서 처리(구현부)하고, 결과를 반환(출력)하는 구조를 지닌다.
  • 반드시 클래스 안에 존재해야 한다.

 

장점

  • 코드의 중복을 줄일 수 있다.
  • 한 곳에서 수행하기 때문에 관리가 쉽다.
  • 코드의 재사용이 가능하다.
  • 코드가 간결하여 이해하기 쉽다.

 

메소드의 작성

  • 메소드는 반복되는 여러 문장을 메소드로 작성을 하는 것으로, 하나의 메소드에 한 가지 기능만 수행하도록 작성하는 것이 좋다
  • 메소드는 기본적으로 선언부, 구현부, 출력부가 있으며 선언부를 통해 값을 입력받고 구현부를 통해 입력 받은 값이 처리되면 출력부를 통해 결과값을 반환하는 형태로 구성된다. 

 

형태

반환타입 메소드명(타입 변수명, 타입 변수명···) {

  메소드 호출 시 실행될 코드 작성 

} return;

int add(int x, int y){
	int result = x + y;
} return result;

 

메소드의 실행 흐름

객체생성 → 메소드 호출 → 메소드의 구현부 작성 → 호출한 곳으로 반환

 

return문

  • 실행중인 메소드를 종료하고 호출한 곳으로 값을 반환한다(되돌아간다)
  • 반환타입이 void일 경우에는 return을 작성하지 않아도 되지만 타입이 존재할 경우 반드시 return을 작성해야 한다.
  • 반환값이 void가 아니면 무조건 return을 사용해야 하며, return과 반환타입을 일치시켜야 한다.
  • 메소드 내에서 조건식을 작성할 때 return문이 거짓일 경우에도 쓰여있는지 확인한다.

매개변수의 유효성 검사

  • 부적절한 값이 들어오면 매개변수의 값을 보정 또는 return문으로 작업을 중단하고 호출한 메소드로 되돌아가게 하는 코드를 반드시 넣어야 한다.

 

기본형 매개변수와 참조형 매개변수

  • 기본형 : 변수의 값을 읽기만 가능하다(Read Only)
  • 참조형 : 변수의 값을 읽고 변경할 수 있다(Read & Write)

 

호출스택

  • 메소드 수행에 필요한 메모리가 제공되는 공간
  • 메소드가 호출되면 호출스택에 메모리가 할당 되고, 종료되면 해제
  • FILO(First In Last Out)방식으로 처음 들어간 메소드가 제일 나중에 처리되며 맨 위의 메소드를 처리하는 동안 나머지 메소드는 대기 상태로 유지 된다.

 

참조형 반환 타입

  • 객체 주소를 반환한다.
  • 값이 아닌 객체의 주소를 받기 때문에 객체를 다룰 수 있다.
  • 재귀호출: 메소드가 자기 자신을 호출하여 일을 시키는 것

 

클래스 메소드와 인스턴스 메소드

차이점 : 클래스 메소드와 인스턴스 메소드의 가장 큰 차이점은 인스턴스 변수의 사용여부다. 인스턴스 메소드는 클래스 변수와 인스턴스 변수 모두 사용할 수 있는 반면에 클래스 메소드는 인스턴스 변수를 사용할 수 없다.

 

인스턴스 메소드

  • 반드시 객체를 통해 인스턴스를 생성하고 [ 참조변수.메소드명() ]의 형태로 호출한다.
  • 인스턴스 멤버(im, iv)와 관련된 작업을 하는 메소드다.
  • 메소드에서 인스턴스 변수를 사용할 수 있다.
  • 인스턴스 메소드는 클래스 메소드를 호출할 수 있다.

클래스(static) 메소드

  • 객체생성 없이 [ 클래스명.메소드명() ]의 형태로 호출한다.
  • 인스턴스 멤버(im, iv)와 관련없는 작업을 하는 메소드다.
  • 메소드 내에서 인스턴스 변수(iv)를 사용할 수 없다(iv를 사용하지 않는건 static을 붙이면 된다)
  • 클래스 메소드는 인스턴스 메소드를 호출할 수 없다.

 

D. 오버로딩(Overloading)

한 클래스 내에서 같은 이름의 메소드를 여러개 정의 하는 것으로, 대표적인 예로 print() 메소드가 있다.

 

오버로딩의 성립 조건

  • 메소드명이 같아야 한다.
  • 매개변수의 개수 또는 매개변수 타입이 달라야 한다.
  • 반환타입은 영향 없다.

오버로딩을 사용하는 이유

  • 같은 기능을 제공하는 메소드를 하나의 이름으로 사용할 수 있다. 그렇기 때문에 메소드 명칭을 절약할 수 있다.

 

E. 오버라이딩(Overriding)

조상(부모) 클래스로부터 상속 받은 메소드를 자신(자식)에 맞게 재정의(변경)하는 것으로, 상속 받은 메소드를 그대로 사용하는 것이 아니라 자손(자식)의 상황에 맞게 변경하여 사용한다는 의미다.

 

오버라이딩의 성립 조건

  • 선언부가 조상(부모)와 일치해야 한다(메소드명, 매개변수, return값)
  • 접근제어자를 조상클래스보다 좁은 범위로 변경할 수 없다.
  • 예외는 조상 메소드 보다 많이 선언할 수 없다.

 

오버로딩과 오버라이딩 차이점(표)

구분 오버라이딩(Overriding) 오버로딩(Overloading)
접근제어자 조상클래스 메소드의 접근제어자보다 더 넓은 범위의 접근제어자를 자손이 설정할 수 없다. 모든 접근제어자를 사용할 수 있다.
리턴 타입 조상과 자손 모두 동일해야 한다. 조상과 자손이 서로 달라도 된다.
메소드명 조상과 자손 모두 동일해야 한다. 조상과 자손 모두 동일해야 한다.
매개변수 조상과 자손 모두 동일해야 한다. 조상과 자손이 서로 달라야 한다.
적용 범위 상속 관계 같은 클래스 내부

 

F. 생성자

인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메소드'다.

 

생성자의 작성 규칙

생성자명이 클래스명과 같아야 한다.

생성자는 return값이 없다(void 안 붙임)

모든 클래스는 반드시 생성자를 가진다.

 

생성자의 종류

  1. 기본 생성자
    • 형태 : 클래스명() { }
    • 매개변수가 없는 생성자
    • 생성자가 하나도 없을 때만 컴파일러가 자동추가 해준다. 왜냐하면 기본 생성자는 반드시 필요하기 때문에.
  2. 매개변수가 있는 생성자
    • 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있게 된다.
    • 인스턴스 생성 후 인스턴스변수의 값을 변경하는 것보다 더욱 코드가 간결하다.

 

G. this

생성자 this()

  • 생성자에서 같은 클래스의 다른 생성자를 호출할 때, 클래스명 대신 this를 사용한다.
  • 다른 생성자 호출 시 첫 줄에서만 사용 가능하다(다른 생성자로 인해 호출이전의 초기화 작업이 무의미해지므로 무조건 첫줄에 작성해야 한다)

 

참조변수 this

  • 인스턴스변수(iv)와 지역변수(lv)의 이름이 같을 때 구별하기 위해 사용한다. 만약 변수 앞에 this가 붙으면 인스턴스변수가 되고, 안 붙이면 매개변수와 가까운 지역변수가 된다.
  • 인스턴스 자신을 가르키는 참조변수(객체의 주소가 저장되어 있음)
  • 인스턴스메소드에서 사용할 수 있다. 단, static 메소드에서는 사용할 수 없다.

 

변수의 초기화

  • 멤버변수(ic, cv)는 자동초기화 한다.
  • 지역변수(lv)는 수동으로 초기화 한다.

 

멤버변수의 초기화화 시기 및 순서

자동초기화 : ∮

간단초기화 : =

복잡초기화

  • {} : 거의 사용하지 않는다.
  • static{} : cv 클래스가 처음 메모리에 올라갈 때 단 한번 초기화 한다.
  • 생성자(){} : 인스턴스변수를 초기화 하며 인스턴스가 생성될 때마다 초기화 한다.

멤버변수의 초기화시기와 순서

클래스 초기화 인스턴스 초기화
기본값 명시적 초기화 클래스 초기화 블럭 기본값 명시적 초기화 인스턴스 초기화 블럭 생성자
cv[0] cv[1] cv[2] cv[2]
iv[0]
cv[2]
iv[1]
cv[2]
iv[2]
cv[2]
iv[3]
순서 :    1 2 3 4 5 6 7

우선순위 : cv → iv / 자동(∮) → 간단(=) → 복잡({}, 생성자)

'Java > Basic' 카테고리의 다른 글

객체지향의 기본 개념 정리2  (0) 2021.07.19
캡슐화  (0) 2021.07.05
인터페이스(interface)  (0) 2021.04.15
추상클래스(abstract class)  (0) 2021.04.08
다형성(polymorphism) - 매개변수의 다형성  (0) 2021.04.03

댓글