본문 바로가기
☕️ JAVA

JAVA의 클래스

by kukim 2021. 11. 1.

xx초등학교 1학년 9반 신입생 10명의 수학, 영어점수 데이터가 있다. 이를 C언어의 변수를 사용하여 저장한다면 각 점수 별 배열을 만들어 저장하거나 사람 별 구조체를 만들어 저장할 수 있다. 만약 해당 데이터에만 작동하는 함수를 만들고 싶다면 어떻게 해야할까? C에서는 함수를 구조체 바깥에 따로 만들어 사용했다. 이 어려움을 극복하고자 프로그래밍 언어자체에서 기능을 제공하여 구조체 + 함수 형태를 만들었다.

OOP(Object - Oriented Programming)

OOP(객체지향프로그래밍)은 프로그래밍 패러다임 중 하나이다. 프로그램 구성하는 기본 요소를 사람이 이해하기 쉬운 "Object(객체)"로 생각하고 프로그래밍 하려고 하는 것이다.

흔히 C 언어는 절차적 언어라고 하는데 이는 변수, 함수, 제어문으로 위에서 아래로 순서대로 실행되는 프로그래밍 언어이다. 객체지향도 사실 컴퓨터 내부적으로 절차적인 순서대로 실행되지만, 프로그래밍 할 때 추상화 작업을 거쳐 사람이 이 세상을 바라볼 때 객체 단위로 이해한다는 철학을 가지고 프로그래밍도 객체단위로 작성하는 것이다.

Class(클래스) 정의

객체지향프로그래밍은 "객체"를 표현하기 위해 "Class"를 사용한다.

클래스란 객체를 정의해주는 틀이다. 그 정의는 아래와 같다.

class Person {
    // filed (멤버 변수)
    int math;
    int english;
    int index;
    int ages;

    // method (함수)
    int sum() {
        return math + english;
    }

    // constructor (생성자)
    public Person(int index) {
        this.index = index;
        this.ages = 8;
        this.math = 0;
        this.english = 0;
    }
}

public class Main {
    public static void main(String[] args) {

    }
}
  • 클래스 정의는 4가지로 구성으로 볼 수 있다.
    1. 접근 지정자
      • 접근 지정자는 해당 클래스에 접근 범위를 제한한다.
      • private, default(생략), protected, public
    2. class 키워드
      • class 키워드를 사용하여 클래스 정의
    3. 클래스 이름
      • 첫 문자가 문자, '_', '$'로 시작
      • 첫 문자 숫자, 자바 키워드, 공백 사용 불가
      • 대소문자 구분
      • 길이제한없음
    4. { 클래스 body }
      1. filed(멤버 변수)
      2. method(함수)
      3. 생성자

객체 만드는 방법 (new 키워드)

  • 클래스를 통해 틀을 만들었다면 클래스를 이용하여 객체를 만든다.
  • 예를 들어 붕어빵 틀이 있고 그곳에 반죽을 넣고 구우면 붕어빵이 되듯이 클래스를 정의하고 new 키워드를 사용해 객체를 만든다. 이때 객체를 만드는 과정 (클래스 → 객체)을 인스턴스화 라고 한다.
public class Main {
    public static void main(String[] args) {
        Person kukim = new Person(); // 객체 생성
    }
}

// C언어
// 만약 person_t이라는 구조체가 있다고 한다면 위 자바 코드는 아래의 C 코드와 동일하다.
person_t *kukim = (person_t)malloc(sizeof(person_t));
  • new Person()을 통해 객체를 만들 수 있다.
  • 이는 사실 C에서 구조체 동적 할당과 동일하게 볼 수 있는데 new Person()는 Person()의 공간만큼 동적할당 하여 그것을 kukim에 대입한 것으로 볼 수 있다.

Variable(변수)

  • JAVA에서 변수는 선언 위치에 따라 종류가 다르다.
  1. instance variable
    • 생성 시기 : 객체 생성 시
    • 클래스 영역에 선언되며, 클래스의 객체(인스턴스)를 생성할 때 만들어진다.
  2. class variable
    • 생성 시기 : 클래스가 메모리 올라갔을 때
    • static 키워드를 사용하여 정의한다.
    • 모든 객체가 공통되게 사용한다. C에서 전역변수라 볼 수 있다.
    • 모든 객체의 공통된 저장공간
  3. local variable
    • 생성 시기 : 변수 선언문이 수행되었을 때
class Person {
    // instance variable
    int math;
    int english;
    int index;
    int ages;

    // class variable
    static String school;

    // Method
    int sum() {
        int bonus_score = 10; // local variable
        return math + english + bonus_score;
    }
}

Method(메서드)

// Method 선언과 구현 
접근지정자 리턴타입 메서드이름(매개변수, ...) {

    // code

    return result;
}

class Person {
        ...
        ...

    // instance Method, 인스턴스 변수를 사용하여 동작, 매개변수 필요 X
    int sum() {
        int bonus_score = 10; // local variable
        return math + english + bonus_score;
    }

    // class Method, 인스턴스 변수와 상관없이 매개변수 만으로 동작 가능
    static int sum2(int math, int english) {
        int bonus_score = 10; // local variable
        return math + english + bonus_score;
    }
}

// 메서드도 마찬가지로 instance method와 class method가 있다.

생성자

  • 클래스 정의 후 인스턴스화 과정을 통해 객체를 생성한다. 이때 객체를 초기화할 때 사용하는 것이 생성자이다.
  1. 기본 생성자
    • 클래스 내부 생성자 없는 경우 컴파일러가 자동으로 추가해주는 생서자
  2. 묵시적 생성자 (명시적 생성자 선언되어있는 경우, 파라미터 없는 생성자를 만들고 싶다면 묵시적 생성자 선언을 꼭 해주어야 한다.)
    • 파라미터 값이 없는 생성자
  3. 명시적 생성자
    • 파라미터 값이 있는 생성자

this 키워드

  • 클래스가 인서턴스화 되었을 때 자기 자신의 메모리 주소를 나타냄
  • 클래스 내부의 변수와 메서드 파라미터를 구분할 때 사용한다.
  • 위의 코드 중 명시적 생성자를 살펴보면 this.index = this를 볼 수 있는데 이는 인스턴스 변수와 메서드 파라미터의 변수를 구분하여 사용할 때 사용된다.
class Person {
    // instance 변수 (멤버 변수)
    int math;
    int english;
    int index;
    int ages;

        ...
        ...
    // constructor (생성자)
    // 묵시적 생성자
    public Person() {

    }
    // 명시적 생성자
    public Person(int index) {
        this.index = index;
        this.ages = 8;
        this.math = 0;
        this.english = 0;
    }
class Person {
    // instance variable
    int math;
    int english;
    int index;
    int ages;

    // class variable
    static String school;

    // instance Method
    int sum() {
        int bonus_score = 10; // local variable
        return math + english + bonus_score;
    }

    // class Method
    static int sum2(int math, int english) {
        int bonus_score = 10; // local variable
        return math + english + bonus_score;
    }

    public Person(int index) {
        this.index = index;
        this.ages = 8;
        this.math = 0;
        this.english = 0;
    }
}

public class Main {
    public static void main(String[] args) {

        // Class Variable
        Person.school = "xx초등학교";
        System.out.println(Person.school);

        // Class Method
        System.out.println("점수 총합 : " + Person.sum2(30, 50));

        // Instance
        Person kukim = new Person(1);
        // Instance Variable
        kukim.math = 30;
        kukim.english = 50;
        // Instance Method
        System.out.println("점수 총합 : " + kukim.sum());

        System.out.println("sex : " + kukim.index);
        System.out.println("생성자 ages : " + kukim.ages);
    }
}

Reference 🌏

댓글