JAVA - OOP(1) 추상화, 메서드, 생성자

이상해씨·2022년 7월 23일
0

웹 풀스택(JAVA)

목록 보기
6/54

✔객체지향 프로그래밍(OOP)

0. OOP의 특징

◾ OOP is A P.I.E
1. Abstraction(추상화) : 현실의 객체를 추상화하여 클래스 구성.
2. Polymorphism(다형성) : 하나의 객체를 여러 가지 타입(형)으로 참조.
3. Inheritance(상속) : 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용 가능.
4. Encapsulation(데이터 은닉과 보호) : 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호할 수 있다.

1. 객체지향 프로그래밍(Object Oriented Programming)

  • 주변의 많은 것들을 객체화(추상화)하여 프로그래밍 하는 것.
    • 객체 : 주체가 아닌 것. 주체가 활용하는 것.
  • OOP의 장점 : 블록 형태의 모듈화된 프로그래밍
    • 신뢰성 높은 프로그래밍 가능.
    • 추가/수정/삭제 용이.
    • 재사용성 높음.
  • 현실 세계 객체, 클래스, 프로그램 객체의 관계
    • 현실의 객체가 갖는 속성과 기능 : 추상화되어 클래스에 정의
    • 클래스 구체화 -> 프로그램 객체(instance, object)
    • 붕어빵 틀(Type 규정), 붕어빵(객체) : 설계도는 하나의 Type, 객체는 설계도를 통해 구현된 것.
  • 프로그램의 클래스와 객체
    • 클래스 : 객체를 정의해 놓은 것으로 설계도, 틀에 해당한다.
    • 객체(instance, object) : 클래스를 데이터 타입으로 메모리에 생성된 것.(클래스의 구체화, 객체화)
    • 객체는 모두 클래스에 선언된 속성을 공통적으로 가지지만 객체별로 다른 상태 값을 가진다.(다양하게 표현이 가능하다.)
    • 클래스로 만든 객체는 참조형(Reference Type)
  • JVM 메모리 구조 : Class Area, Method Stack, Heap
    • Class Area : 클래스 원형 로딩
      • Filed 정보
      • Method 정보
      • 타입 정보
      • Constant Poll
    • Method Stack : 메서드들의 실행 공간
      • Thread별 관리
      • 메서드 호출 순서대로 쌓이는 구조
      • 메서드 프레임에 각 로컬 변수도 쌓이는 구조
      • 로컬 변수는 선언된 영역을 벗어나면 삭제
    • Heap : 객체를 저장하기 위한 영역
      • Thread에 의해 공유
      • 생성된 객체는 프로그래머가 삭제할 수 없음 => Garbage Collection만이 제어 가능

2. 메서드(Method)

  • 메서드(Method) : 객체와 관련된 서브 루틴 (또는 함수)이자 클래스가 갖고 있는 기능.
  • 메서드 정의의 필요성
    • 메서드가 없다면 필드(멤버 변수)에 접근하기 위해 항상 코드 새로 작성해야한다.
    • 메서드를 통해 모듈화로 필요한 작업 반복 실행 가능하다.
  • 선언부 : 리턴_타입 메서드명(파라미터){코드}
  • 리턴 타입(Return Type) : 호출 결과 호출한 곳으로 반환되는 값의 타입.(반환값이 없다면 void.)
    • 리턴 타입은 하나만 적용 가능.
    • 결과를 받을 때 Promotion(묵시적 형 변환) 가능.
  • 메서드명 : 메서드가 수행하는 작업을 쉽게 파악하도록 의미있는 이름 사용.
  • 파라미터 : 메서드 호출 시점에 필요한 변수들. 없을 경우 생략
    • 파라미터 전달 시 Promotion(묵시적 형 변환) 허용
  • Variable arguments : 메서드 선언 시 몇 개의 인자가 들어올지 예상할 수 없는 경우(또는 가변적).
    • 배열 타입 선언도 가능하지만 메서드 호출 전 배열 생성 및 초기화 과정이 필수로 번거롭다.
    • ...을 이용해 파라미터 선언 -> 호출시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화.
      • 가장 일반적인 예시는 print() 함수들.
// Variable arguments
int test(int... nums){
	int sum = 0;
    for (int num : nums){
    	sum += num;
    }
    return sum;
}
  • 구현부

    • 중괄호({}) 내에서 처리해야하는 내용. 비즈니스 로직 구성.
    • 마지막에 return 문장으로 값 반환.(void일 경우 생략 가능.)
  • 메서드 호출 : 메서드명(파라미터)

    • 메서드의 선언부에 맞춰 호출.(메서드 이름 반드시 동일. 파라미터 선언된 파라미터 개수 반드시 통일.)

    • 메서드 접근 : 멤버 변수와 마찬가지로 static 또는 non static 상태 구분하여 호출

      종류소속 클래스접근 방법
      Static Member같은 클래스바로 호출 - 멤버명
      다른 클래스클래스명.멤버명
      Non Static Member같은 클래스바로 호출 - 멤버명
      다른 클래스객체명.멤버명
  • 메서드 호출 스택 : Stack(First in Last Out == Last in First In)

    • 메서드 호출시 메서드 동작을 위해 메모리 할당.
    • 최상위 메서드부터 동작(가장 마지막에 추가된 메서드.).
  • 기본형 변수와 참조형 변수

    • 메서드 호출 시 파라미터로 입력된 값 복사하여 전달 : Call by Value
    • 참조형 변수는 주소를 값으로 가지므로 주소값이 복사되어 전달된다.
      • 따라서, 원래 변수의 값이 변경될 수 있으므로 주의해야한다.
  • 메서드 오버로딩(Method Overloading) : 동일한 기능을 수행하는 메서드의 추가 작성.

    • 기억해야할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능.
    • 메서드 이름 동일. 파라미터 (개수/순서/타입) 변경. 리턴 타입은 의미 없음.
// test 메서드 오버로딩.
void test(int num){
	System.out.println(num);
}
void test(String name, int num){
	System.out.println(name + " : " + num);
}

3. 생성자(Constructor)

  • 생성자(Constructor) : new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드.
    • 멤버 변수 초기화, 객체 생성시 실행되어야하는 작업 실행을 위해 사용.
  • 생성자 작성 규칙
    • 메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일.
  • 생성자의 종류
    • 기본 생성자(Default Constructor) : 메서드명(){}
      • 파라미터가 없고 구현부가 비어있는 형태.
      • 생성자 코드가 없으면 컴파일러가 기본 제공
    • 파라미터가 있는 생성자 : 메서드명(파라미터){ 코드 }
      • 일반 멤버 변수의 초기화 -> 생성자 호출시 파라미터를 통해 초기화
      • 파라미터가 있는 생성자 구현시 기본 생성자가 자동 생성되지 않음.(상황에 따라 오버로딩 필요.)
// 생성자 예시
class Test(){
	// 기본 생성자.
    Test(){
    	System.out.println("기본 생성자가 호출되었습니다.");
    }
    // 파라미터 생성자.
    Test(int num){
    	System.out.println("파라미터 : "+num+"이 전달되었습니다.);
    }
	
}
  • this : 참조 변수로 객체 자신을 의미하는 키워드.
    • 참조 변수를 통해 객체 멤버에 접근하는 것처럼 this를 이용해 자신의 멤버에 접근 가능.
    • 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 표현할 때 사용.
    • 객체에 대한 참조이므로 static 영역에서는 사용 불가.
  • this() : 객체 자신의 생성자를 의미하는 키워드.
    • 객체 생성시 필요한 멤버 변수 초기화 -> 생성자별 중복 코드 발생.
    • 한 생성자에서 다른 생성자 호출시 사용하여 중복 해소.
    • 반드시 생성자 블록의 첫 줄에서만 호출 가능.
profile
후라이드 치킨

0개의 댓글