Programming/Java

JAVA - OOP(1)

조용장 2022. 7. 31. 14:14

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

  • 객체란?
    • 주체가 아닌 것,주체가 활용하는 것
  • 객체지향 프로그래밍
    • 주변의 많은 것들을 객체화 해서 프로그래밍 하는 것
    • 객체지향은 객체를 많이 만드는 것을 추천한다?

객체지향 프로그래밍의 장점

  • 블록 형태의 모듈화된 프로그래밍
    • 신뢰성 높은 프로그래밍이 가능하다
    • 추가/수정/삭제가 용이하다
    • 재 사용성이 높다

현실 세계 객체, 클래스,프로그램의 객체(instance,object)의 관계

  • 현실의 객체가 갖는 속성과 기능은 추상화(abstraction) 되어 클래스에 정의된다!
  • 클래스는 구체화 되어 프로그램의 객체(instance,object)가 된다
  • 프로그램의 클래스와 객체
    • 클래스
      • 객체를 정의해 놓은 것 즉 객체의 설계도,틀
      • 클래스는 직접 사용할 수 없고 직접 사용되는 객체를 만들기 위한 틀을 제공할 뿐
    • 객체(instance,object)
      • 클래스를 데이터 타입으로 메모리에 생성된 것

변수

변수의 종류

  • 타입에 따른 분류

    • Primitive Type variable(기본형) - 기본 8가지 type의 변수
      • boolean, int, char, float, long, double, byte, short
    • Reference Type variable(참조형) - 나머지 모든것
      • Strin , Person 등
  • 선언 위치에 따른 분류

      public class VariableTypes {
          int instanceVariable;    //    인스턴스 멤버 변수
          static int classVariable;    //    클래스 멤버 변수
          public static void main(String[]    args)    {//    파라미터 변수
              int localVariable =    10;    //    로컬 변수
              for (int i =    0;    i <    100;    i++)    {    //    로컬 변수
                  System.out.println(i);
              }
          }
      }

인스턴스 멤버 변수의 특징

  • 선언 위치 : 클래스 { }영역에 선언

      String    name;
  • 변수의 생성 : 객체가 만들어질 때 객체 별로 생성됨

    • 생성 메모리 영역 :heap
  • 변수의 초기화 : 타입 별로 default초기화

  • 변수에의 접근 : 객체 생성 후(메모리에 올린 후) 객체 이름(소속)으로 접근

    • 객체를 만들 때마다 객체 별로 생성 → 객체마다 고유한 상태(변수 값) 유지
  • 소멸 시점

    • Garbage Collector에 의해 객체가 없어질 때,프로그래머가 명시적으로 소멸시킬 수 없음

클래스 멤버 변수의 특징

  • 선언 위치 : 클래스 { }영역에 선언되며 static키워드를 붙임

      static String    scientificName =    "Homo    Sapiens";
  • 변수의 생성 : 클래스 영역에 클래스 로딩 시 메모리 등록

    • 개별 객체의 생성과 무관
    • 모든 객체가 공유하게 됨(공유 변수라고도 불림)
  • 변수의 초기화 : 타입 별로 default초기화

  • 변수에의 접근 : 객체 생성과 무관하게 클래스 이름(소속)으로 접근

    • 객체를 생성하고 객체 이름으로 접근도 가능하나 static에 부합한 표현은 아님

      Person.scientificName =    "클래스를 통한 변경";
  • 소멸 시점

    • 프로그램 종료 시

지역 변수 & 파라미터 변수

  • 선언 위치 : 클래스 영역의 { } 이외의 모든 중괄호 안에 선언되는 변수들

    • 메서드,생성자,초기화 블록

      void call(String    to){                                 //    파라미터 변수
        String    beep    =    "띠";                                    //    로컬 변수
        for(int i=0;    i<3;    i++){                 //    로컬 변수
            System.out.println(beep);
        }
      }
  • 변수의 생성 : 선언된 라인이 실행될 때

    • 생성 메모리 영역 :thread별로 생성된 stack 영역
  • 변수의 초기화 : 사용하기 전 명시적 초기화 필요

  • 변수에 접근 : 외부에서는 접근이 불가하므로 소속 불필요

    • 내부에서는 이름에 바로 접근
  • 소멸 시점

    • 선언된 영역인 {} 을 벗어날 때

메서드

메서드 정의와 필요성

  • 메서드란?

    • 현실의 객체가 하는 동작을 프로그래밍 화
    • 어떤 작업을 수행하는 명령문의 집합
  • 메서드를 작성하는 이유

    • 반복적으로 사용되는 코드의 중복 방지
    • 코드의 양을 줄일 수 있고 유지 보수가 용이함
  • 메서드의 작성 방법

      제한자 리턴_타입 메서드이름(타입 변수_명, 타입 변수_명…) // 선언부
      {
          // do something // 구현부
      }

선언부

  • 리턴타입
    • 호출 결과 호출한 곳으로 반환되는 값의 타입으로 아무것도 리턴하지 않을 경우 void
    • 결과를 받을 때 묵시적 형 변환 적용
    • 리턴 타입은 하나만 적용 가능
  • 메서드 이름
    • 메서드가 수행하는 작업을 쉽게 파악하도록 의미 있는 이름 사용
  • 파라미터 목록
    • 메서드 호출 시점에 넘겨줘야 하는 변수들로 넘겨줄 정보가 없을 경우 생략 가능
    • 파라미터 전달 시 묵시적 형변환 적용

Variable arguments

  • 메서드 선언 시 몇 개의 인자가 들어올 지 예상할 수 없을 경우 (또는 가변적)
    • 배열 타입을 선언할 수 있으나 → 메서드 호출 전 배열을 생성,초기화 해야 하는 번거로움
    • … 을 이용해 파라미터를 선언하면 호출 시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화

구현부

  • 구현부는 중괄호 내에서 처리해야 하는 내용 즉 비즈니스 로직 작성
  • 마지막에는 선언된 리턴 타입에 해당하는 값을 return문장과 함께 반환해야 함
    • 값 반환 시에는 묵시적 형 변환 적용
    • 리턴 타입이 void여서 반환할 값이 없을 경우 return문장 생략 가능
    • 메서드 수행 도중 return문장을 만나거나 마지막 문장을 수행하는 경우 메서드는 종료
      • 조건문을 이용해서 return할 경우 모든 조건에서 return필요

메서드 호출

  • 메서드를 호출할 때는 메서드의 선언부에 맞춰 호출해야 함
    • 메서드 이름 : 반드시 동일
    • 파라미터 : 선언된 파라미터의 개수는 반드시 동일,타입은 promotion적용 가능
  • 메서드 접근
    • 멤버 변수와 마찬가지로 static또는 nonstatic상태를 구분해서 호출
    • static member
      • 소속: 클래스
      • 접근 방법 : 같은 클래스는 바로 호출, 다른 클래스인 경우 클래스_이름.멤버_이름
    • non static member(instance member)
      • 소속: 객체
      • 접근 방법 : 같은 클래스는 바로 호출, 다른 클래스인 경우 객체_이름.멤버_이름

class 멤버와 instance 멤버간의 참조와 호출

  • 가장 중요한 것은 메모리에 있는가?
    • 메모리에 있으면 호출 가능
    • 메모리에 없으면 호출 불가
  • staticmember → 언제나 메모리에 있음
    • 클래스 로딩 시 자동 등록
  • instancemember → 객체 생성 전에는 메모리에 없음
    • 객체 생성 시 모든 일반 멤버들은 메모리에 생성
    • 객체 즉 레퍼런스를 통해서 접근

메서드 호출 스택

  • 스택(stack)
    • First in Last out의 구조
  • 메서드 호출 스택
    • 각각의 메서드 호출시 메서드 동작을 위한 메모리 상자를 하나씩 할당
      • 상자 내부에 메서드를 위한 파라미터 변수 등 로컬 변수 구성
  • A 메서드에서 새로운 메서드 B호출 시 B 실행을 위한 메모리 상자를 쌓음
    • 언제나 맨 위에 있는 메모리 상자(B) 만 활성화
    • 이때 A 메서드는 동작이 끝나지 않고 잠시 정지된 상태
    • B가 리턴하게 되면 B를 위한 상자가 제거되며 메모리 반납
    • 비로서 A가 최 상위가 돼서 다시 동작 재개

기본형 변수와 참조형 변수

  • 메서드 호출 시 파라미터로 입력된 값을 복사해서 전달

메서드 오버로딩

  • overloading: 동일한 기능을 수행하는 메서드의 추가 작성
    • 일반적으로 메서드 이름은 기능별로 의미 있게 정함
    • 동일한 기능을 여러 형태로 정의해야 한다면?
  • 메서드 오버로딩의 장점
    • 기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능

메서드 오버로딩 방법

  • 메서드 이름은 동일
  • 파라미터의 개수 또는 순서,타입이 달라야 할 것
    • 파라미터가 같으면 중복 선언 오류
  • 리턴 타입은 의미 없음

생성자

  • 객체를 생성할 때 호출하는 메서드 비슷한 것

    • new키워드와 함께 호출하는 것
    • 일반 멤버 변수의 초기화나 객체 생성 시 실행돼야 하는 작업 정리
  • 작성 규칙

    • 메서드와 비슷하나 리턴 타입이 없고 이름은 클래스 이름과 동일

      제한자 클래스_명 (타입 변수_명, 타입 변수_명…) //선언부
      {
        // 멤버 변수 초기화 작업 // 구현부
      }

생성자의 종류

  • 기본 생성자(defaultconstructor)
    • 그 동안 예제에서는 생성자를 작성하지 않았음
      • 기본 생성자의 형태는 파라미터가 없고 구현부가 비어있는 형태
      • 생성자 코드가 없으면 컴파일러가 기본 생성자 제공
  • 파라미터가 있는 생성자
    • 생성자의 목적이 일반 멤버 변수의 초기화à 생성자 호출 시 값을 넘겨줘서 초기화
    • 주의!파라미터가 있는 생성자를 만들면 기본 생성자는 추가되지 않는다.

this.

  • 참조 변수로써 객체 자신을 가리킴
    • 참조변수를 통해 객체의 멤버에 접근했던 것처럼 this를 이용해 자신의 멤버에 접근 가능
  • 용도
    • 로컬 변수와 멤버 변수의 이름이 동일할 경우 멤버 변수임을 명시적으로 나타냄
    • 명시적으로 멤버임을 나타낼 경우 사용
  • this는 객체에 대한 참조
    • 따라서 static영역에서 this사용 불가

this()

  • 메서드와 마찬가지로 생성자도 오버로딩 가능
    • 객체 생성 시 필요한 멤버변수만 초기화 진행 → 생성자 별 코드의 중복 발생
    • 한 생성자에서 다른 생성자를 호출할 때 사용
  • 반드시 첫 줄에서만 호출이 가능

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

JAVA - I/O 와 XML  (0) 2022.07.31
JAVA - Exception Handling & Collection Framework  (0) 2022.07.31
JAVA - OOP(3)  (0) 2022.07.31
JAVA - OOP(2)  (0) 2022.07.31
JAVA - 기본, 배열, 다차원 배열  (0) 2022.07.31