JAVA

객체지향프로그래밍

작은달팽이 2022. 12. 8. 16:04

객체지향 언어

코드의 재사용성이 높다

코드의 관리가 용이하다

신뢰성이 높은 프로그래밍이 가능하다

 

클래스와 객체

클래스 : 객체를 정의해 놓은 것, 객체의 설계도, 객체를 생성하는데 사용

객체 : 메모리에 생성된 것

객체의 구성요소

객체 : 속성과 기능의 집합

멤버 : 객체가 가지고 있는 속성과 기능

속성 : 멤버변수

기능 : 메서드

객체와 인스턴스

인스턴스 : 클래스로부터 만들어진 객체

인스턴스화 : 클래스로부터 객체를 만드는 과정

한 파일에 여러 클래스 작성하기

소스파일의 이름 = public class 이름

대소문자까지 일치해야 한다. 

하나의 소스파일에는 1개의 public class만 존재한다.

public class가 없는 경우 소스파일의 이름은 클래스의 어떤 이름이어도 가능하다. 

객체의 생성과 사용

클래스명 변수명;     // 클래스의 객체를 참조하기 위한 참조변수 선언

변수명 = new 클래스명();   // 객체 생성 후, 객체의 주소를 참조변수에 저장

클래스명 변수명 = new 클래스명();     //  위 두문장을 한 문장으로 사용가능 

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 

참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

 

인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있다.

메서드의 내용은 모든 인스턴스에 대해 동일하다.

객체배열

객체배열 : 많은 수의 객체를 다뤄야 할 때 사용, 참조변수들을 하나로 묶은 참조변수 배열

객체 배열 생성 : 객체가 저장된 것은 아니다. 객체 생성 후 객체 배열의 각 요소에 저장하는것이 필수

배열의 초기화 블럭 또는 for문을 사용한다.

예) Tv[] tvArr = { new Tv(), new Tv(), new Tv(), .... };

        또는

Tv[] tvArr = new Tv[100];

for (int i=0; i < tvArr.length ; i++) {

      tvArr[i] = new tv();

}

클래스의 정의

데이터와 함수의 결합

1. 변수 : 하나의 데이터를 저장할 수 있는 공간

2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간

3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간

4. 클래스 : 데이터와 함수의 결합 (구조체 + 함수)

클래스 : 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것

사용자 정의 타입

사용자 정의 타입 : 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것

자바에서는 클래스 = 사용자 정의 타입

선언위치에 따른 변수의 종류

변수의 종류 : 클래스 변수, 인스턴스 변수, 지역변수 

지역변수 (lv)

  • 멤버변수를 제외한 나머지 변수들
  • 클래스 영역 이외의 영역에 선언 

클래스 변수 (cv)

  • 멤버변수 중 static이 붙은 변수 
  • 클래스 영역에 선언
  • 클래스가 메모리에 올라갈 때 생성 (인스턴스 생성 없이 사용 가능)
  • 모든 인스턴스가 공통 저장공간 공유
  • 한 클래스의 모든 인스턴스들이 공통값을 유지해야하는 속성일 때 선언
  • 클래스이름.클래스변수     형식으로 사용

인스턴스 변수 (iv)

  • 멤버변수 중 static이 붙지 않은 변수 
  • 클래스 영역에 선언 
  • 인스턴스 생성 시 생성
  • 인스턴스마다 별도의 저장공간을 가진다. (서로 다른값 저장 가능) 
  • 인스턴스마다 고유한 상태를 유지해야하는 속성일 때 선언

 메서드

메서드(=블랙박스) : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것 (함수와 유사)  

  • 선언부 : 반환타입 메서드이름 (타입 변수명, 타입 변수명, ....)
  • 구현부 : 메서드 호출시 수행될 코드

메서드의 선언부

메서드의 선언부 :  반환타입 메서드이름(매개변수 선언)              형식으로 구성

매개변수 선언 

  • 메서드가 작업 수행 시 필요한 값들을 제공받기 위한 것 (입력)
  • 필요한 값의 개수만큼 변수 선언 (쉼표로 구분)
  • 변수의 타입이 같아도 타입 생략 불가 예) int add(int x, int y) { } 매개변수 x,y의 타입이같아도 x,y 모두에 타입입력필수
  • 매개 변수 개수가 많은 경우 → 배열, 참조변수 사용
  • 입력할 값이 없다면 → 괄호 안 공백   예) int add( ) { }

반환타입

  • 메서드 결과값(출력)의 타입 
  • 반환값이 없는 경우 → 반환타입 void      예) void print( ) { }

메서드의 구현부

메서드를 호출했을 때 수행될 문장

return문

  • 반환값이 있는경우 반드시 구현부 { } 안에 return 반환값;   작성 필수
  • 반환값의 타입은 반환타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.
  • 단 하나의 값만 반환 가능 (입력은 여러개여도 출력은 최대 하나만 가능)

지역변수

  • 메서드 내에 선언된 변수
  • 서로 다른 메서드라면 같은 이름의 변수 선언 가능

메서드의 호출

메서드를 호출해야 구현부의 문장들이 수행된다.

인수와 매개변수

인수(인자)

  • 메서드 호출 시 괄호 안에 지정해준 값들
  • 개수와 순서는 메서드에 선언된 매개변수와 일치해야 한다.
  • 타입 : 매개변수의 타입과 일치하거나 자동 형변환 가능한 것이어야 한다.

return문

  • 현재 실행중인 메서드 종료 후 호출한 메서드로 되돌아간다.
  • 반환값이 있는 경우(반환타입이 void가 아닌경우) 반드시 return문이 있어야 한다.
  • if문 사용시 주의! if문만 사용 시 조건식의 결과에 따라 return문이 실행되지 않을 수도 있으므로
  • else문을 추가하여 블럭 각각에 return문이 있도록 해야 한다. (항상 결과값 반환)

 기본형 매개변수

  • 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (저장된 값만 복사)

참조형 매개변수

  • 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (인스턴스의 주소가 복사)

참조형 반환타입

반환하는 값의 타입이 참조형 정수값 반환(참조형 타입의 값은 객체의 주소)

static 메서드와 인스턴스 메서드

클래스 메서드 

  • 메서드 앞에 static 
  • 객체 생성 없이    클래스이름.메서드이름(매개변수)   호출가능
  • 인스턴스와 관계없는 메서드(인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드)

인스턴스 메서드

  • 메서드 앞에 static이 없음
  • 반드시 객체 생성해야 호출가능
  • 메서드 작업 수행 시 인스턴스 변수가 필요

static을 언제 붙여야 할까?

  1. 클래스의 멤버변수 중 모든 인스턴스에서 같은 값이 유지되어야 하는 변수
  2. 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드

메서드 간의 호출과 참조

  • 같은 클래스 내의 메서드 → 객체 생성,참조변수 없이 호출가능
  • static 메서드 → 인스턴스 메서드 호출불가
  • 인스턴스 메서드 → 인스턴스 변수 사용 가능
  • static 메서드 → 인스턴스 변수 사용 불가

오버로딩(overloading)

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것

  1. 메서드 이름이 같아야 한다
  2. 매개변수의 개수 또는 타입이 달라야 한다.
  3. 반환 타입은 관계없다.

생성자(constructor)

인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드, 인스턴스변수의 초기화 작업에 주로 사용

  1. 생성자의 이름은 클래스의 이름과 같아야 한다.
  2. 생성자는 리턴 값이 없다.

클래스이름(타입 변수명, 타입 변수명, ...) {

           주로 인스턴스 변수의 초기화 코드

}

오버로딩이 가능하다(하나의 클래스에 여러개의 생성자 존재 가능)

* 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

기본 생성자(default constructor)

  • 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.
  • 소스파일(.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 자도으로 기본생성자를 추가하여 컴파일 된다.
  • 클래스이름( ) { }

매개변수가 있는 생성자

매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.

매개변수를 갖는 생성자를 사용하는 것은 코드를 보다 간결하고 직관적으로 만든다.

예) Car c = new Car("white", "auto", 4);

생성자에서 다른 생성자 호출하기 - this()

  1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
  2. 한 생성자에서 다른 생성자를 호출할 때는 반ㄷ시 첫 줄에서만 호출이 가능하다.

두가지 조건 만족 시 생성자 간에도 서로 호출이 가능하다.

객체 자신을 가리키는 참조변수 - this

생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴수변수의 이름이 일치하는 경우가 자주 있다.

이 때 this를 사용해서 구별되도록 하는 것이 명확하고 이해하기 쉽다.

  • this : 인스턴스 자신을 가리키는 참조변수. (static메서드에서 사용불가) / 모든 인스턴스메서드에 지역변수로 숨겨진 채 존재한다.
  • this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

변수의 초기화

변수를 선언하고 처음으로 값을 저장하는 것

가능하면 선언과 동시에 초기화하는 것이 바람직.

  • 멤버변수(클래스 변수와 인스턴스 변수)는 자동적으로 기본값으로 초기화된다.
  • 지역변수는 사용하기 전에 반드시 초기화해야 한다.

멤버변수의 초기화

  • 클래스 변수(cv) 초기화 → 인스턴스 변수(iv) 초기화  순서
  • 자동 초기화 → 명시적 초기화(간단) → 초기화 블럭, 생성자(복잡)

명시적 초기화 : 변수를 선언과 동시에 초기화하는 것

초기화 블럭 

클래스 초기화 블럭 :

  • 클래스 변수의 초기화에 사용된다. 
  • 처음 메모리에 로딩될 때 한번만 수행
  • static { }

인스턴스 초기화 블럭 :

  • 인스턴스변수의 복잡한 초기화에 사용된다.
  • 인스턴스가 생성될 때마다 수행
  • 클래스 내에 블럭 { }