[Java] Java공부 3일차(2)

HwangHyoSang·2022년 7월 4일
0

객체 지향 프로그래밍

객체 지향 프로그래밍(Object-Oriented Programming) 은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)와 행위(behave)로 이루어진 객체로 만드는 것!

객체

다른 곳에 재활용성이 높음. 그만큼 문제도 발생.

추상화

  • 우리가 자동차를 운전할 때, 부품들이 어떻게 상호작용하여 자동차가 움직이는지 신경쓰지않음.
  • 객체들에서 공통된 특징을 모아 추상화하고 객체들 각각의 특징에 따라
    확장시킬 수 있음.

부품화의 비유

  • 객체 지향은 부품화의 정점이라고 할 수 있다.

은닉화, 캡슐화

  • 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출
  • 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다.

인터페이스

  • 인터페이스는 부품들 간의 약속이다.
  • HDMI

추상화 - extends(확장) 인터페이스 - implements(구현)

추상화는 공통의 키워드를 가지고 하위 클래스들이 특징을 자신에게 맞게 확장해 나가는 방식

인터페이스 - 하위 클래스들이 반드시 특정 동작을 하는 인터페이스의 메소드를 구현해야함

/*
비둘기 라는 객체가 존재할 때, 비둘기가 동물 이라는 추상클래스에 속해있다면 동물의 특징들 중 본인에게 맞는 특징을 표현할 수 있다.

그에비해 비둘기가 동물 이라는 인터페이스는 가지고, 동물 인터페이스에 짖기, 백덤블링, 네발로 뛰기 라는 메소드를 가진다면 비둘기는 위의 행동들을 강제로 해야한다. */

- 클래스와 인스턴스는 충분히 이해하고 있는 내용이여서 스킵! -

클래스 - 클래스는 연관되어 있는 변수와 메소드의 집합이다.

인스턴스 - 클래스라는 설계도를 이용하여 만들어낸 제품

A 클래스가 있다고 가정할 때

A 변수 = new A(초기값 or 빈칸)

클래스 멤버와 인스턴스 멤버!

클래스 변수

static을 맴버(변수,메소드) 앞에 붙이면 클래스의 맴버가 된다.

클래스에 직접 접근하여 클래스 멤버를 수정하면 모든 인스턴스가 해당 변수를 접근할 때 변경된 값의 영향을 받음

인스턴스 멤버는 변경하더라도 해당 클래스를 상속받은 다른 인스턴스들은 영향을 안받음

클래스 변수의 용도를 정리해보면 아래와 같다.

- 인스턴스에 따라서 변하지 않는 값이 필요한 경우 (위의 예에서는 PI)
(이런 경우 final을 이용해서 상수로 선언하는 것이 바람직 하지만 final을 아직 배우지 않았기 때문에 언급하지 않았다)
- 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
- 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우

클래스 메소드

static이 붙지 않은 클래스 내의 메소드는 클래스에 직접 접근해서 호출 불가

static이 붙은 클래스 메소드는 클래스에 직접 접근하여 호출가능.

Class.method();

인스턴스 메소드는 클래스 맴버에 접근 할 수 있다.

클래스 메소드는 인스턴스 맴버에 접근 할 수 없다.

인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 
생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 맴버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다.

예시

class C1{
    static int static_variable = 1;
    int instance_variable = 2;
    static void static_static(){
        System.out.println(static_variable);
    }
    static void static_instance(){
        // 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다. 
        //System.out.println(instance_variable);
    }
    void instance_static(){
        // 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
        System.out.println(static_variable);
    }
    void instance_instance(){        
        System.out.println(instance_variable);
    }
}
public class ClassMemberDemo {  
    public static void main(String[] args) {
        C1 c = new C1();
        // 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
        // 인스턴스 메소드가 정적 변수에 접근 -> 성공
        c.static_static();
        // 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
        // 정적 메소드가 인스턴스 변수에 접근 -> 실패
        c.static_instance();
        // 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
        // 인스턴스 메소드가 클래스 변수에 접근 -> 성공
        c.instance_static();
        // 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공 
        // 인스턴스 메소드가 인스턴스 변수에 접근 -> 성공
        c.instance_instance();
        // 클래스를 이용해서 클래스 메소드에 접근 -> 성공
        // 클래스 메소드가 클래스 변수에 접근 -> 성공
        C1.static_static();
        // 클래스를 이용해서 클래스 메소드에 접근 -> 성공
        // 클래스 메소드가 인스턴스 변수에 접근 -> 실패
        C1.static_instance();
        // 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
        //C1.instance_static();
        // 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
        //C1.instance_instance();
    }

}

용어

인스턴스 변수와 클래스 변수는 아래와 같이 부르기도 한다.

인스턴스 변수 -> Non-Static Field
클래스 변수 -> Static Field
필드(field)라는 것은 클래스 전역에서 접근 할 수 있는 변수를 의미하는데 이에 대한 자세한 내용은 유효범위 수업에서 알아보겠다.
profile
하루의 기억을 정리하는 기록장

0개의 댓글