새소식

📘 기초 지식/Java

객체지향 프로그램

  • -

-객체는 속성과 기능으로 이루어져 있다.

여기서 속성과 기능은 필드와 메서드로 정의할 수 있고 이너클래스와 함께 멤버라고 부른다.

 

-객체는 아래와 같이 생성 가능

 

클래스명 참조_변수명 = new 생성자();

 

-생성한 객체는 . 을 이용해서 접근할 수 있는데 아래와 같다.

 

참조 변수명.필드명 // 필드값 불러오기
 참조 변수명.메서드명() // 메서드 호출

- static 키워드는 정적을 나타냄

풀어서 인스턴스는 메서드를 호출할 때 참조 변수명을 이용해서 호출하지만 static은 클래스 이름으로 호출 가능하다.

또한 인스턴스 변수는 고유성을 가져서 변수에 할당된 값 그대로 출력되지만 static 변수는 값을 공유한다.

 

- 메서드는 특정 작업을 수행하는 명령문들의 집합

메서드 시그니처와 메서드 바디로 이루어져있고 아래와 같은 구조를 취한다.

 

자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
	메서드 내용 // 메서드 바디
}

 

void 타입은 return을 하지 않는다.

메서드 오버로딩은 하나의 클래스 안에 같은 일므의 메서드를 여러 개 정의하는 것인데 이 때 이름은 같되 매개변수의 개수 또는 타입이 달라야 한다.

 

- 생성자는 객체를 생성하는 역할을 하는 클래스의 구성 요소로, 인스턴스가 생성될 때 홀출되는 인스턴스 초기화 메스드

new 키워드로 객체를 생성할 때 호출되는 것이 생성자

1. 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 타입이 없다.

또한 클래스 안에는 한개 이상의 생성자가 꼭 있어야하고 생성자를 만들지 않으면 기본생성자가 자동으로 생성된다.

기본생성자와 매개변수가 있는 생성자가 있다.

 

this와 this()의 차이점

this()는 생성자 내부에서만 사용가능하고 반드시 첫 줄에 위치해야한다.

자신이 속한 클래스에서 다른 생성자를 호출할 때 사용함

 

this는 매개변수가 있는 생성자를 사용할 때 인스턴스 변수와 매개변수를 이름만으로 구분하기 어려워질 때 이를 구분해주기 위해 사용한다.

 

예시 코드)

 

public class ConstructorExample {
    public static void main(String[] args) {
        Car c = new Car("Model x", "빨간색", 250);
        System.out.println("제 차는 " + c.getModelName() + "이고, 컬러는 " + c.getColor() +"입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

    public Car(String modelName, String color, int maxSpeed) {
        this.modelName = modelName;
        this.color =color;
        this.maxSpeed = maxSpeed;
    }

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

 

 

- 내부 클래스는 클래스 내에 선언된 클래스로 정적 내부 클래스, 인스턴스 내부 클래스, 지역 내부 클래스가 있다.

 

종 류                                                        선언 위치                                                                    사용 가능한 변수

인스턴스 내부 클래스(instance inner class) 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) 외부 인스턴스 변수, 외부 전역 변수
정적 내부 클래스(static inner class) 외부 클래스의 멤버변수 선언위치에 선언(멤버 내부 클래스) 외부 전역 변수
지역 내부 클래스(local inner class) 외부 클래스의 메서드나 초기화블럭 안에 선언 외부 인스턴스 변수, 외부 전역 변수
익명 내부 클래스(anonymous inner class) 클래스의 선언과 객체의 생성을 동시에 하는 일회용 익명 클래스 외부 인스턴스 변수, 외부 전역 변수

 

인스턴스 내부 클래스 예시 코드)

 

class Outer { //외부 클래스
    private int num = 1; //외부 클래스 인스턴스 변수
    private static int sNum = 2; // 외부 클래스 정적 변수

    private InClass inClass; // 내부 클래스 자료형 변수 선언

    public Outer() {
        inClass = new InClass(); //외부 클래스 생성자
    }

    class InClass { //인스턴스 내부 클래스
        int inNum = 10; //내부 클래스의 인스턴스 변수

        void Test() {
            System.out.println("Outer num = " + num + "(외부 클래스의 인스턴스 변수)");
            System.out.println("Outer sNum = " + sNum + "(외부 클래스의 정적 변수)");
        }
    }

    public void testClass() {
        inClass.Test();
    }
}

public class Main {
    public static void main(String[] args) {
        Outer outer = new Outer();
        System.out.println("외부 클래스 사용하여 내부 클래스 기능 호출");
        outer.testClass(); // 내부 클래스 기능 호출
    }
}

// 출력값

외부 클래스 사용하여 내부 클래스 기능 호출
Outer num = 1(외부 클래스의 인스턴스 변수)
Outer sNum = 2(외부 클래스의 정적 변수)

 

정적 내부 클래스 예시 코드)

 

public class Main {
    public static void main(String[] args) {
        Outer.StaticInClass a = new Outer.StaticInClass();
        a.test();
    }
}

class Outer {
    private int num = 3;
    private static int sNum = 4;

    void getPrint() {
        System.out.println("인스턴스 메서드");
    }

    static void getPrintStatic() {
        System.out.println("스태틱 메서드");
    }

    static class StaticInClass {
        void test() {
            System.out.println("Outer num = " + sNum +  "(외부 클래스의 정적 변수)");
            getPrintStatic();
        }
    }
}

'📘 기초 지식 > Java' 카테고리의 다른 글

[Java] 빌더 패턴(Builder Pattern)이란?  (0) 2023.05.17
[JAVA]컬렉션  (0) 2022.11.10
객체지향 프로그래밍 심화  (0) 2022.11.07
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.