[JAVA] 클래스(Class)

Taesu Seo·2021년 3월 28일
0

JAVA

목록 보기
2/3
post-thumbnail

객체 지향 프로그래밍

객체(Object)물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성(객체의 데이타)을 가지고 있고 다른 것과 식별 가능한 것

객체는 속성(=필드(field))동작(=메소드(method))으로 구성

프로그래밍은 결국 데이터를 다루는 일이라 생각되며, 객체 지향 프로그래밍에서도 해당
객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용하면서 동작. 객체들 사이의 상호작용 수단은 메소드이며, 객체가 다른 객체의 기능을 이용하는 것이 바로 메소드 호출

다형성(Polymorphism)

김영한님 인프런 강의스프링 핵심 원리 - 기본편 강의 초반에 이런 말씀을 하심

스프링 뭐 별거 없습니다. 결국 스프링이란 것도 자바의 객체지향의 다형성을 극대화 시켜서 사용하는거라고 보면 됩니다.

그 후로 공부 할 때 이 부분을 항상 의식하면서 공부하고 있으며, 다형성은 다음과 같은 특징이 있음

  • 다형성(多形性)
    • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
    • 부모 타입에는 모든 자식 객체가 대입될 수 있음
    • 인터페이스 타입에는 모든 구현 객체 가 대입될 수 있음
    • 다형성의 효과로 객체는 부품화가 가능하다

객체와 클래스

객체 지향 프로그래밍에선 메모리에서 사용하고 싶은 객체가 있다면 우선 설계도로 해당 객체를 만드는 작업이 필요하며, 자바에서는 설계도가 바로 클래스(Class)
클래스에는 객체를 생성하기 위한 필드메소드가 정의되어 있음
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 함

클래스 선언

  • 영어 대소문자를 구분하며 관례적으로 첫 자를 대문자로 작성

객체 생성

  • new

    • 클래스로부터 객체체를 생성
    • 해당 연산자로 생성된 객체메모리 힙(heap) 영억에 생성
    • 연산자는 힙 영역에 객체를 생성시킨 후, 객체의 주소를 리턴
    Study s1 = new Study();

클래스 구성 멤버

public class ClassName {
    // 필드
    int fieldName;
    
    // 생성자
    ClassName() { ··· }
    
    // 메소드
    void methodName() { ··· }
}

필드(Field)

  • 객체의 데이터가 저장되는 곳

  • 초기값이 지정되지 않은 필드들은 객체 생성 시 자동으로 기본 초기값으로 설정(변수와 헷갈리지 말것)

    선언 형태는 변수(variable)과 비슷하지만, 필드를 변수라고 부르진 않음

    • 필드: 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재
    • 변수: 생성자와 메소드 내에서만 사용 되며 생성자와 메소드가 실행 종료되면 자동 소멸

생성자

  • new 연산자로 호출
  • 객체 생성 시 초기화를 담당
  • 클래스 이름으로 되어 있고 리턴타입이 없다
  • 컴파일러가 기본생성자를 생성해주며, 클래스 내에 생성자가 없을 경우에만 생성
  • 기본 생성자가 없이 오버로딩 된 생성자만 있을 경우, 기본 생성자로 객체생성 불가
  • 접근제어를 private으로 설정할 경우 싱글톤(Singleton)으로 설정되며 new연산자로 생성하지 못함

메소드

  • 필드를 읽고 수정하는 역할
  • 다른 객체를 생성해서 다양한 기능을 수행
  • 객체 간의 데이터 전달의 수단으로 사용
  • 외부로부터 매개값을 받을 수 있으며, 실행 후 어떤 값을 리턴할 수 있음

정적 멤버와 static

  • 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
  • 정적 필드와 정적 메소드를 선언하는 방법은 선언 시 static 키워드를 추가
public class ClassName {
    // 정적 필드
    static 타입 필드 [= 초기값];
    
    // 정적 메소드
    static 리턴 타입 메소드( 매개변수 선언, ··· ) { ··· }
}
  • 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리하므로, 클래스의 로딩이 끝나면 바로 사용 할 수 있음
  • 정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 보통
static double pi = 3.141592;
  • 일반적으로 필드는 생성자에서 초기화하지만, 정적 필드객체 생성 없이도 사용해야 하므로 생성자에서 초기화 작업을 할 수 없음
  • 정적 필드의 복잡한 초기화 작업을 위해서는 정적 블록(static block)을 사용
static {
   ···
}

싱글톤

전체 프로그램에서 단 하나의 객체만 만들도록 보장해야하고 공유토록 하기위해 싱글톤(Singleton)객체를 사용함

  • 외부에서 new연산자로 생성자를 호출할 수 없도록 만들어야 함
  • 생성자 앞에 private접근 제한자를 붙여주면 외부에서 접근하지 못함
  • 자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화
  • 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴
public class ClassName {
    //정적 필드
    private static ClassName singleton = new ClassName();
    
    // 생성자
    private ClassName {}
    
    // 정적 메소드
    static ClassName getInstance() {
    	return singleton;
    }
}
  • 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법
ClassName sgt1 = ClassName.getInstance();
ClassName sgt2 = ClassName.getInstance();
profile
Connecting the dots

0개의 댓글