감자코딩
  • JAVA 객체지향언어 기초
    2024년 07월 23일에 업로드 된 글입니다.
    작성자: gamzah
    반응형

    1. 객체지향언어

    1.1 객체지향언어의 역사

    • 실제 사물의 속성과 기능을 분석한 다음, 데이터와 함수로 정의함으로써 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현, 모의실험을 하는것이 객체지향의 시작.
    • 1960년대 중반에 프로그래밍언어에 적용한 최초의 객체지향언어가 탄생함.(시뮬라)

    1.2 객체지향언어

    객체지향언어의 주요특징

    1. 코드의 재사용성이 높다.
    2. 코드의 관리가 유용하다.
    3. 신뢰성이 높은 프로그래밍을 가능하게 한다.

    → 프로그램의 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선함

    2. 클래스와 객체

    2.1 클래스와 객체의 정의와 용도

    클래스

    • 정의 : 클래스란 객체를 정의해 놓은 것이다.
    • 용도 : 클래스는 객체를 생성하는데 사용된다.

    객체

    • 정의 : 실제로 존재하는 것. 사물 또는 개념
    • 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
    • 사물(유형). 논리, 개념(무형)

    2.2 객체와 인스턴스

    • 인스턴스화 : 클래스로부터 객체를 만드는 과정
    • 인스턴스 : 어떤 클래스로부터 만들어진 객체

    2.3 객체의 구성요소 - 속성과 기능

    • 속성 = 멤버변수 = 특성 = 필드 = 상태
    • 기능 = 메서드 = 함수 = 행위

    2.4 인스턴스의 생성과 사용

    클래스명 변수명; // 클래스의 객체롤 참조하기 위한 참조변수를 선언
    변수명 = new 클래스명 (); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
    
    Tv t; // Tv클래스 타입의 참조변수 t를 선언
    t = new Tv(); // Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
    • 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야한다.
    • 하나의 인스턴스를 여러 개의 참조변수가 가리키는 건 가능
    • 여러 인스턴스를 하나의 참조변수가 가리키는 건 불가능

    2.5 객체 배열

    Tv[] tvArr = new Tv[3]; // 참조변수 배열 (객체 배열)을 생성
    // 객체를 생성해서 배열의 각 요소에 저장
    tvArr[0] = new Tv ();
    tvArr[1] = new Tv ();
    tvArr[2] = new Tv ();
    
    // 배열의 초기화 블럭을 사용하여 한줄로도 가능
    Tv[] tvArr = {new Tv(), new Tv(), new Tv()};

    2.6 클래스의 또 다른 정의

    1. 클래스 - 데이터와 함수의 결합
      ```java

    데이터 저장형태의 발전과정

    1. 변수 하나의 데이터를 저장할 수 있는 공간
    2. 배열 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
    3. 구조체 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
    4. 클래스 데이터와 함수의 결합 (구조체 + 함수)
    5. 클래스 - 사용자정의 타입

    3. 변수와 메서드

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

    변수의 종류 선언위치 생성시기
    클래스 변수 클래스 영역 클래스가 메모리에 올라갈 때
    인스턴스 변수 클래스 영역 인스턴스가 생성되었을 때
    지역변수 클래스 영역 이외의 영역 변수 선언문이 수행되었을 때
    1. 인스턴스 변수
    • 클래스의 인스턴스를 생성할 때 만들어짐
    • 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있음
    • 인스턴스마다 고유한 상태를 유지해야 하는 속성의 경우에 사용
    1. 클래스 변수
    • 인스턴스 변수 앞에 static 붙이면 됨
    • 모든 인스턴스가 공통된 저장공간을 공유함
    • 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성의 경우에 사용
    • 인스턴스를 생성하지 않아도 언제든지 쓸 수 있음
    • 전역변수의 성격을 갖는다
    1. 지역변수
    • 메서드 내에 선언, 메서드 내에서만 사용 가능
    • 메서드가 종료되면 소멸됨

    3.2 클래스변수와 인스턴스변수

    • 클래스 변수 : 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 가짐
    • 인스턴스 변수 : 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 다른 값을 유지

    3.3 메서드

    메서드를 사용하는 이유

    1. 높은 재사용성
    • 한번 만들어 놓은 메서드는 여러번 호출 가능하고, 다른 프로그램에서도 사용 가능
    1. 중복된 코드의 제거
    • 반복되는 문장들을 묶어서 하나의 메서드로 작성하여 코드 중복을 제거
    • 변경사항이 발생하면 메서드만 수정하면 되므로 관리가 쉽다
    1. 프로그램의 구조화
    • 프로그램의 흐름을 알기 쉽게 단순하게 구조화 할 수 있음

    3.4 메서드의 선언과 구현

    반환타입 메서드 이름 (타입 변수명, 타입 변수명, …) //선언부
    {
        // 메서드 호출 시 수행될 코드                 //구현부
    }

    메서드 선언부

    • 선언 후에 변경사항이 발생하지 않도록 신중히 작성
    • 메서드 선언부를 변경하게 되면 그 메서드가 호출되는 모든 곳도 같이 변경해야 함
      반환타입 메서드이름 매개변수선언
      int add (int x, int y) {
        int result = x + y;
        return result; //결과를 반환
      }

    매개변수 선언

    • 메서드가 작업을 수행하는데 필요한 값들을 제공받기 위한 것
    • 변수 타입이 같아도 타입 생략 불가
    • 지역변수임

    메서드의 이름

    • 동사로 대부분 짓는다
    • 이름만으로도 기능을 알 수 있도록 함축적이면서 의미있게 지어야 함

    반환타입

    • 반환타입이 없는 경우 void 사용

    메서드의 구현부

    • 메서드를 호출 했을 때 수행되는 문장을 적는 부분

    return문

    • 반환값을 호출한 메서드로 전달
    • 값의 타입은 반환타입과 일치하거나 적어도 자동형변환이 가능해야 함
    • 단 하나의 값만 반환할 수 있음

    지역변수

    • 메서드 내에 선언된 변수들은 해당 메서드 안에서만 사용할 수 있다

    3.5 메서드의 호출

    인자와 매개변수

    • 인자의 개수와 순서는 호출된 메서드에 선언된 매개변수와 일치해야 함
    • 인자의 타입은 매개변수의 타입과 일치하거나 자동 형변환이 가능해야 함

    메서드의 실행흐름

    • 같은 클래스 내의 메서드끼리는 참조변수를 사용하지 않고 서로 호출 가능
    • static 메서드는 같은 클래스 내의 인스턴스 메서드 호출 불가
    • 메서드가 호출되면 실행중이던 메서드는 실행을 잠시 멈추고 호출된 메서드의 문장들이 실행됨
    • 호출된 메서드 작업이 끝나면 다시 호출한 메서드로 돌아와 이후 문장 수행

    3.6 return문

    • 현재 실행중인 메서드를 종료하고 호출한 메서드로 되돌아간다
    • void 면 생략가능하다. 컴파일러가 자동으로 추가해줌

    3.7 JVM의 메모리 구조

    1. 메서드 영역
    • 프로그램 실행 중 클래스가 사용되면 JVM이 해달 클래스의 클래스파일을 분석하여 클래스에 대한 정보를 이곳에 저장되며 클래스 변수도 이 영역에 함께 생성된다.
    • 인스턴스가 생성되는 공간, 인스턴스 변수들이 생성되는 공간.
    1. 호출스택
    • 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다.
    • 메서드가 수행을 마치고나면 사용했던 메모리를 반환하고 스택에서 제거된다.
    • 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이다.
    • 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

    3.8 기본형 매개변수와 참조형 매개변수

    • 기본형 매개변수 : 변수의 값을 읽기만 가능
    • 참조형 매개변수 : 변수의 값을 읽고 변경 가능

    3.9 참조형 반환타입

    • 반환하는 값의 타입이 참조형

    3.10 재귀호출

    • 메서드의 내부에서 메서드 자신을 다시 호출하는 것
    • 조건문이 필수적임
    • 반복문보다 수행시간이 더 오래걸리지만 논리적인 간결함의 이점이 있다.

    3.11 클래스 메서드와 인스턴스 메서드

    • 인스턴스 메서드 : 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드
    • 클래스 메서드 : 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드
    1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙임
    2. 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있음
    3. 클래스 메서드는 인스턴스 변수를 사용할 수 없음
    4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

    3.12 클래스 멤버와 인스턴스 멤버간의 참조와 호출

    • 인스턴스 멤버가 존재하는 시점에 클래스 멤버는 항상 존재하지만, 클래스멤버가 존재하는 시점에 인스턴스 멤버가 존재하지 않을 수도 있다.

    4. 오버로딩

    4.1 오버로딩이란?

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

    4.2 오버로딩의 조건

    1. 메서드 이름이 같아야 한다
    2. 매개변수의 개수 또는 타입이 달라야 한다

    4.3 오버로딩의 예

    • println 메서드
    • println 메서드를 호출할 때 매개변수 값의 타입에 따라서 오버로딩된 메서드들 중 하나가 선택되어 실행됨

    4.4 오버로딩의 장점

    • 같은 기능을 하는 메서드들을 타입과 개수만 다르게 해서 쓰므로 기억하기도 쉽고 이름을 절약할 수 있음

    4.5 가변인자와 오버로딩

    • 메서드의 매개변수 개수를 동적으로 지정해 주는 것
    • '타입... 변수명' 과 같은 형식으로 선언된다
    • 가변인자 외에 매개변수가 더 있다면 가변인자를 매개변수중에서 가장 마지막에 선언해주어야함

    5. 생성자

    5.1 생성자란?

    • 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드
    1. 생성자의 이름은 클래스의 이름과 같아야 하낟
    2. 생성자는 리턴 값이 없다.

    5.2 기본 생성자

    • 컴파일러가 자동으로 추가해주는 기본 생성자임
    • 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐임

    5.3 매개변수가 있는 생성자

    • 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있음
    • 인스턴스를 생성한 다음에 인스턴스 변수의 값을 변경하는 것보다 매개변수를 갖는 생성자를 사용하는 것이 코드를 보다 간결하고 직관적으로 만들어준다.
    • 클래스를 작성할 때 다양한 생성자를 제공함으로써 인스턴스 생성 후에 별도로 초기화를 하지 않아도 되도록 만드는것이 바람직하다

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

    - 생성자의 이름으로 클래스 이름 대신 this를 사용하낟
    - 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다
    this |  인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.
            모든 인스턴스 메서드에 지연변수로 숨겨진 채로 존재한다
    this(), this(매개변수) | 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

    5.5 생성자를 이용한 인스턴스의 복사

    • 똑같은 상태의 인스턴스를 추가로 생성할 수 있음
    • 인스턴스 변수의 값들만 다름

    6. 변수의 초기화

    6.1 변수의 초기화

    • 멤버변수와 배열의 초기화는 선택적이지만, 지역변수의 초기화는 필수다

    6.2 명시적 초기화

    • 변수를 선언과 동시에 초기화하는 것

    6.3 초기화 블럭

    클래스 초기화 블럭      | 클래스변수의 복잡한 초기화에 사용, 처음 로딩 될 때 한번만 수행
    인스턴스 초기화 블럭    | 인스턴스변수의 복잡한 초기화에 사용, 인스턴스를 생성할 때 마다 수행
    • 메서드 내에서와 같이 조건문, 반복문, 예외처리 구문등을 자유롭게 사용할 수 있음
    • 초기화 작업이 복잡할 경우 사용

    6.4 멤버변수의 초기화 시기와 순서

    변수의 종류 선언위치
    클래스변수의 초기화시점 클래스가 처음 로딩될 때 단 한번 초기화
    인스턴스변수의 초기화시점 인스턴스가 생성될 때마다 각 인스턴스별로 초기화
    클래스변수의 초기화순서 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
    인스턴스변수의 초기화순서 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자
    반응형

    'JAVA' 카테고리의 다른 글

    자바 Stream API 설명 및 정리  (0) 2024.10.31
    JAVA 배열의 기초 및 개념  (0) 2024.07.23
    JAVA 조건문 기초 및 개념  (2) 2024.07.23
    JAVA 연산자 기본개념 및 기초  (0) 2024.07.22
    JAVA 변수의 개념과 기본  (0) 2024.07.22
    댓글