JAVA 기초

[JAVA 기초] JAVA의 정석 - Ch.06 객체지향 프로그래밍 I (정리)

beginner-in-coding 2025. 1. 15. 16:04

Ch.06 객체지향 프로그래밍 I


-      객체지향 언어

  •  객체지향언어의 역사
    • 객체지향론의 이론: 실제 세계는 사물(객체)로 이루어져있으며, 발생하는 모든 사건들은 객체간의 상호작용임
  • 객체지향언어
    • 주요 특징
      1. 코드의 재사용성이 높음: 기존의 코드를 이용해서 쉽게 작성
      2. 코드의 관리가 용이: 관계를 이용해서 유지보수 쉬움
      3. 신뢰성이 높은 프로그램 작성 가능: 제어자와 메서드를 이용해서 데이터의 무결성과 정확성 유지 가능, 코드의 중복을 제거해서 불일치로 인한 오류를 줄임

-      클래스와 객체

  • 클래스와 객체의 정의와 용도
    • 정의: 클래스란 객체를 정의해 놓은 것 (설계도)
    • 용도: 객체를 생성하는데 사용
      • 객체의 정의: 실제로 존재하는 것, 사물이나 개념 (실제 사용하는 것)
      • 객체의 용도: 객체가 가지고 있는 기능과 속성을 이용해서 원하는 작업을 수행
  • 객체의 인스턴스
    • 인스턴스화(instantiate): 클래스(설계도)로부터 객체(실제 사용하는 것)을 만드는 과정
    • 인스턴스(instance): 클래스로부터 만들어진 객체를 의미
  • 객체의 구성요소 – 속성과 기능
    • 속성(property): 멤버 변수(member variable), 특성(attribute), 필드(field), 상태(state)
    • 기능(function): 메서드(method), 함수(function), 행위(behavior)
      • 객체지향에서의 속성: 멤버 변수
      • 객체지향에서의 기능: 메서드
  • 인스턴스의 생성과 사용
    • 클래스명 변수명;  //인스턴스의 생성, 클래스의 객체를 참조하기 위한 참조변수 선언
    • 변수명 = new 클래스명();  //객체를 생성 후, 객체의 주소를 참조변수에 저장
    • 인스턴스는 참조변수를 통해서만 다룰 수 있음
  • 객체 배열
    • 많은 수의 객체를 다루기 위해 사용
    • 객체 배열안에는 객체가 아닌 객체의 주소가 저장되어 있음
    • 클래스이름[] 참조변수이름 = new 클래스이름[배열 길이];
  • 클래스의 또 다른 정의
    • 프로그래밍 관점에서의 정의
      • 클래스: 데이터와 함수의 결합(구조체 + 함수)
      • 변수: 하나의 데이터를 저장할 수 있는 공간
      • 배열: 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간(물리적 연속적)
      • 구조체: 서로 관련된 여러 데이터를 종류에 상관없이 하나의 집합으로 저장할 수 있는 공간

-      변수와 메서드

  • 선언 위치에 따른 변수의 종류
    • 클래스 변수(class variable): 클래스 영역, 클래스가 메모리에 올라갈 때(컴파일시)
      • 인스턴스를 생성하지 않고 사용 가능
      • 전역변수(global variable)의 성질을 가지고 있음
      • 클래스 변수의 생명주기: 메모리에 로딩될 때부터 프로그램 종료될 때까지
    • 인스턴스 변수(instance variable): 클래스 영역, 인스턴스가 생성되었을 때
      • 고유한 값을 가져야 하는 경우 사용
    • 지역 변수(local variable): 클래스 영역 이외의 괄호{} 영역, 변수 선언문이 수행되었을 때
      • 지역 변수의 생명주기: 선언 시작부터 메서드가 종료될 때까지
      • 범위인 괄호{}를 벗어난 곳은 사용할 수 없음
  • 클래스 변수와 인스턴스 변수
    • 클래스 변수의 접근 방법: 클래스이름.클래스변수이름
    • 인스턴스 변수의 접근 방법: 클래스의 참조변수(인스턴스)를 생성 후, 참조변수이름.인스턴스변수이름
    • 클래스변수: 메모리에 올라가서 모든 클래스가 동일한 값을 가지고 하나의 저장공간을 공유
    • 인스턴스 변수: 각 인스턴스마다 고유한 값을 지정해줄 수 있음
  • 메서드
    • 특정 작업을 수행하는 일련의 문장을 하나로 묶어놓은 것
    • 사용하는 이유
      1. 높은 재사용성(reusability)
      2. 중복된 코드 제거
      3. 프로그램의 구조화
  • 메서드의 선언과 구현
    • 선언부(header)
      • 반환타입 메서드이름(타입 변수명1, 타입 변수명2, ...)
      • 메서드가 작업을 수행하기 위한 정보를 제공
      • 매개변수(parameter declaration): 함수 안에서 사용할 값을 전달받기 위해 사용
        • 변수 선언만함, 변수 생성과 초기화는 선언부의 매개변수 부분에서 하지 않음
      • 메서드 이름(method name): 메서드를 호출할 때 사용하는 이름 정의
        • 이름만으로 기능을 유추할 수 있도록 함축적이고 의미있는 이름으로 정의
      • 반환 타입(return type): 함수의 결과를 어떤 타입으로 반환할 것 인지 정의
        • 메서드의 작업 수행 결과의 타입 정보를 의미
    • 구현부(body)
      • {  //메서드 호출시 수행할 코드  }
      • return 문
        • void: 반환 타입 없음
        • 메서드에서의 결과는 지역변수로써, 메서드 외부에서 접근할 수 없음
        • 선언된 반환 타입에 맞게 return을 통해 값을 전달해야함
      • 지역 변수(local variable)
        • 메서드 내에서 생성한 변수의 이름과 전역변수의 이름이 같을 경우 지역변수가 쓰임
        • 지역변수는 그 구간에서만 사용하므로, 다른 구역에서 선언/생성해도 됨
  • 메서드의 호출
    • 인자(argument)와 매개변수(parameter)
      • 메서드를 호출할 때 괄호()안에 지정해준 값
      • 인자의 개수와 순서는 메서드 선언의 매개변수와 일치
      • 인자값을 넣을때는 매개변수의 타입과 일치하거나 자동형변환이 가능해야함
  • Return 
    • void인 경우 생략 가능 (컴파일러가 자동으로 추가)
    • 선언문에 반환값이 있는 경우, return문 필수
    • 사용 방법: 메서드의 실행 결과값 전달, 매개변수의 유효성 검사, ... 
  • JVM의 메모리 구조
    • 메서드 영역(Method Area)
      • 프로그램이 실행되면 JVM이 클래스파일(*.class)를 읽어서 분석하여 클래스에 대한 정보를 저장하는 공간
      • 클래스 변수가 저장되는 공간
    • 힙(Heap)
      • 인스턴스, 인스턴스 변수가 생성되는 공간
    • 호출 스택(Call Stack)
      • 메서드 작업에 필요한 메모리 공간을 제공
        1. 메서드 호출
        2. 호출스택에 메모리 할당
        3. 메서드가 작업을 진행하는 동안에 생기는 결과, 지역 변수 등을 저장
        4. 메서드가 종료되면 메모리 공간을 반환
      • 호출 스택에 제일 위에 있는 메서드가 현재 실행중인 메서드
  • 기본형 매개변수와 참조형 매개변수
    • 기본형 매개변수: 변수의 값을 읽기만 할 수 있음
    • 참조형 매개변수: 변수의 값을 읽고 변경할 수 있음
    • 참조형 매개변수는 해당 주소를 접근해서 값을 변경해야함
  • 참조형 반환타입
    • 참조형 타입의 값: 객체의 주소
    • 메서드가 객체의 주소를 반환한다는 의미
  • 재귀호출(recursive call)
    • 재귀 메서드: 메서드 내부에서 자신을 다시 호출하는 것을 의미
    • 탈출 조건문이 필수로 작성되어야함 (무한 반복 호출)
      • 매개변수의 유효성 검사 필수
    • 사용 예시: 팩토리얼
  • 클래스 메서드(static method)와 인스턴스 메서드
    • 인스턴스 메서드(instance method): 인스턴스 변수를 가지고 작업을 진행하는 메서드
    • 클래스 메서드(class method): 인스턴스 변수와 관계없는 작업을 진행하는 메서드
    • 공통적으로 사용해야 하는 것(클래스 메서드, 변수)에는 static으로 표시
  • 클래스 멤버와 인스턴스 멤버간의 참조와 호출
    • 클래스 메서드 안에서는 인스턴스 변수, 메서드를 사용할 수 없음
    • 메서드가 호출될 당시에 인스턴스가 존재하지 않으면 메서드 영역에 등록할 수 없기 때문

-      오버로딩(overloading)

  • 오버로딩이란
    • 한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것
  • 오버로딩의 조건
    •  조건
      1. 메서드의 이름이 같아야함
      2. 매개변수의 타입 또는 개수는 달라야함
  • 오버로딩의 예
    • 같은 일을 하지만 전달해야하는 값이나 받아야하는 매개변수가 다를 경우에 사용
  • 오버로딩의 장점
    • 메서드의 이름 정의 시간 단축
    • 사용시 하나의 이름으로 정의되어 있으므로 가독성이 좋고 유용함
  • 가변 인자와 오버로딩
    • 가변인자(varible argument): 내부적으로 배열을 이용
      • 배열로 하면 무조건 값을 전달해줘야하는 문제 발생(null, 0)
      • 가변인자를 사용하면 생략할 수 있음
    • 매개변수 중 가장 마지막에 선언
    • (타입 ... 변수명)  //가변인자 사용 방법

-      생성자(constructor)

  • 생성자란
    • 인스턴스 초기화 메서드
    • 규칙
      • 생성자의 이름은 클래스의 이름과 같아야함
      • 리턴값이 없음
    • 매개변수를 달리하여 여러 생성자 정의 가능
  • 기본 생성자(default constructor)
    • 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 추가
      • 클래스 내에 생성자가 하나도 정의되어 있지 않을 경우에만 자동 추가
    • 클래스이름() {}  //기본생성자
  • 매개변수가 있는 생성자
    • 인스턴스를 생성한 후에 인스턴스변수의 값을 변경하는 것보다 매개변수로 생성과 동시에 값을 초기화하는 것이 직관적이고 편리함
  • 생성자에서 다른 생성자 호출하기 – this(), this
    • this(), this(매개변수)
      • 클래스 내에서 클래스 내의 다른 생성자를 호출하기 위해 사용
      • 사용시 생성자의 첫 번째 줄에서 선언해야함
    • this
      • 인스턴스 자신을 가리키는 참조변수
      • 인스턴스의 주소가 저장되어 있음
  • 생성자를 이용한 인스턴스의 복사
    • 클래스의 생성자의 매개변수로 클래스를 받아 인스턴스를 복사함
    • 같은 인스턴스를 공유하는 것이 아니므로 서로 독립적인 작업이 가능

-      변수의 초기화

  • 변수의 초기화
    • 변수를 선언하고 처음으로 값을 저장하는 것
    • 멤버변수(클래스 변수, 인스턴스 변수)는 선택적, 지역변수는 사용하기 전 필수로 초기화
    • 멤버변수의 초기화 방법
      1. 명시적 초기화
      2. 생성자
      3. 초기화 블럭
  • 명시적 초기화(explicit initialization)
    • 변수를 선언과 동시에 초기화하는 것
  • 초기화 블록(initialization block)
    1. 클래스 초기화 블럭
      • 클래스 변수의 복잡한 초기화에 사용
      • static {  // 클래스 초기화 블럭 내용  }
    2. 인스턴스 초기화 블럭
      • 인스턴스 변수의 복잡한 초기화에 사용
      • {  //인스턴스 초기화 블럭 내용  }
  • 멤버변수의 초기화 시기와 순서
    • 클래스 변수의 초기화 시점: 클래스가 처음 로딩될 때 한번 실행
    • 인스턴스 변수의 초기화 시점: 인스턴스가 생성될 때마다 각 인스턴스 별로 초기화가 이뤄짐
    • 클래스 변수의 초기화 순서
      1. 기본값
      2. 명시적 초기화
      3. 클래스 초기화 블럭
    • 인스턴스 변수의 초기화 순서
      1. 기본값
      2. 명시적 초기화
      3. 인스턴스 초기화 블럭
      4. 생성자