본문 바로가기

JAVA

[Java] Abstraction

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

  주변의 많은 것들을 객체화 해서 프로그래밍 하는 것

OOP의 장점

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

Class vs Object

현실의 객체 --(추상화)--> 클래스 // 현실의 객체의 속성과 기능은 추상화 되어 클래스에 정의됨
클래스 --(구체화)--> 프로그램의 객체 // 클래스는 구체화되어 프로그램의 객체(instance, object)가 됨.
클래스 : 객체를 정의해 놓은 것, 즉, 객체의 설계도
객체 : 클래스를 데이터 타입으로 메모리에 생성되어 실제로 동작하는 것

JVM 메모리 구조

meta-space
    클래스 정보처리
        타입 정보, field 정보, method 정보
stack
    메서드들의 실행 공간 
        thread 별로 별도 관리
        메서드 호출 시 마다 메서드 프레임 적층
        프레임에 로컬변수도 쌓이는 구조
heap
    객체를 저장하기 위한 영역
        thread에 의해 공유
        객체가 생성되고 G.C에 의해 정리됨
        상수 풀

위치에 따른 변수의 종류

타입에 따른 분류 : primitive/reference type
선언 위치에 따른 변수 : 멤버 변수, 지역 변수
    인스턴스 멤버 변수의 특징
        클래스 {} 영역에 선언
        객체가 만들어질 때 heap에 객체 별로 생성됨
        객체 이름으로 접근
        GC에 의해 객체가 없어질 때 소멸
    클래스 멤버 변수의 특징
        클래스 {} 영역에 static 키워드를 붙여서 선언
        클래스 로더에 의해 클래스가 로딩 될 때 heap에 클래스 별로 생성됨
        객체와 무관하게 클래스 이름으로 접근
        (객체 이름으로도 접근은 가능하나 static에 부합한 표현은 아니다)
        클래스가 언로드 될 때 GC 발생
    지역 변수 & 파라미터 변수
        클래스 영역의 {} 이외의 모든 중괄호 안에 선언되는 변수들
        선언된 라인이 실행될 때 stack의 메서드 프레임 내부에 생성됨
        사용하기 전 명시적 초기화 필요
        선언된 영역을 벗어날 때 소멸

메서드

메서드란? 현실의 객체가 하는 동작을 프로그래밍화
이를 통해 코드 중복방지, 유지 보수에 용이
기본 선언
    제한자 리턴타입 메서드이름(타입 변수명 ....){

    }
variable arguments
    메서드 선언 시 동일 타입의 인자가 몇 개 들어올 지 알 수 없는 경우
    배열타입을 선언하면 사용이 번거롭다
    ... 키워드를 이용해 선언하면 호출 시 
    넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화
    public int sum(int... params){
        int sum = 0;
        for(int num : params)
            sum += num;
        return sum;
    }
메서드 호출
    static/non-static 상태를 구분해서 호출
    static의 경우 바로 사용이 가능하나, non-static의 경우 객체를 만들고 접근해야 한다
    **자바는 call by value만 존재한다. call by reference가 아님.**
    메서드의 인자로 전달되는 value가 primivite형인지 reference형인지 파악하는 것이 중요

메서드 오버로딩
    동일한 기능을 수행하는 메서드의 추가 작성
    서로 다른 인자에 대해서 동일한 기능을 수행할 수 있다.
    기억해야 할 메서드가 감소하고 중복 코드에 대한 효율적 관리 가능
    메서드의 이름은 동일하고 파라미터의 개수 또는 순서, 타입이 달라야 함

'JAVA' 카테고리의 다른 글

[Java] Package  (0) 2024.01.17
[Java] Inheritance : 상속  (0) 2024.01.17
[Java] Constructor : 생성자  (0) 2024.01.17
[Java] 객체지향  (0) 2024.01.15
[Java] 자바 기초와 실수하기 쉬운 부분  (0) 2024.01.15