자바 - 객체지향 프로그래밍과 클래스

불순분자들·2022년 9월 23일

자바

목록 보기
6/16

객체지향 프로그래밍

객체지향 프로그래밍( OOP : Object-orient programming )은 모든 것을 객체( Object )로 보고 그 객체들끼리 역할, 책임, 협력 등 객체들의 관계를 중심으로 프로그래밍하는 기법을 말한다.

객체지향의 4대 특성

캡슐화( encapsulation )

  • 객체의 속성과 행위를 하나로 묶고 구현 내용 일부를 외부에 감추어 은닉할 수 있다.

상속( inheritance )

  • 상위 클래스의 속성과 행위를 상속받을 수 있다. 하위 클래스는 필요한 특성을 추가하여 사용할 수 있다.

추상화( abstraction )

  • 상세한 정보는 무시하고 필요성에 의해 있어야 할 정보들만 간추려서 구성하는 것으로 공통점을 추출하는 것이다.

다형성( polymorphism )

  • 같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질을 말한다.

클래스

  • 클래스는 객체지향 프로그래밍에서 객체를 생성하기 위한 것이다. 클래스는 객체의 상태와 행위가 정의되어 있는 일종의 설계도이기 때문에 비슷한 구조를 갖지만 상태는 다른 서로 다른 많은 객체를 만들 수 있따.

필드

  • 필드란 클래스에 포함된 변수를 의미한다. 객체의 상태를 나타내며, 멤버 변수라고도 한다.
public class Book { // <- 클래스
    static int aBook; // 1. 클래스 변수
    String bBook; // 2. 인스턴스 변수
    
    void read() {
        String cBook; // 3. 지역변수
    }
}
  1. 클래스 변수( static variable ) : static 키워드가 인스턴스 변수 앞에 붙여진 변수를 말함.
    heap이 아닌 static 영역에 할당되어 GC의 관리를 받지 않는다. public이 붙으면 전역변수라 한다.

  2. 인스턴수 변수( instance variable) : 인스턴스가 갖는 변수, 인스턴스가 생성될 때 생성되며, 서로 독립적인 값을 갖고 있어 heap 영역에 할당되고, GC에 의해 관리된다.

  3. 지역 변수( local variable ) : 특정 메서드 내에서만 사용되는 변수.

객체의 생성과 new

new 연산자

[new] 키워드는 새로운 객체( 인스턴스 )에 메모리를 할당하고 메모리에 대한 참조값을 반환하여 클래스를 인스턴스화 한다.
객체가 메모리에 할당되는 것을 인스턴스라고 부르기 때문에 new는 메모리에 할당시키는 역할을 한다 볼 수 있다.

객체의 생성과정

  1. new 연산자가 메모리 영역( heap )에 저장 공간을 할당 받는다.
  2. 생성자가 객체를 초기화시킨다.
  3. new 연산자가 새로 생긴 객체의 주소를 변수에 저장한다.
  4. 변수를 통해 해당 객체에 접근한다.

초기화 블록( initializer )

  • 초기화 블록 내에서는 조건문, 반복문과 같은 제어문을 사용해 인스턴스 및 클래스 변수를 초기화 할 수 있다.
public class Book {
    stacit String aBook;
    String bBook;
    
    static {
        aBook = "A"; // 클래스 변수 초기화
    }
    {
        bBook = "B"; // 인스턴스 변수 초기화
    }
}

클래스 초기화 블록

  • 클래스 변수를 초기화 할 수 있다.

인스턴스 초기화 블록

  • 인스턴스 변수를 초기화할 수 있다.

추가 접근 제어자

접근제어자는 해당 클래스 또는 멤버( 변수, 메소드 )를 정해진 범위에서만 접근할 수 있게 해준다.

  • static : 객체를 생성하지 않아도 고정된 메모리 영역을 할당받는다.( static 영역 ) -> 객체를 생성하지 않아도 공유되어 사용할 수 있다.

  • final : 클래스 앞에 붙으면 해당 클래스는 상속될 수 없으며, 변경할 수 없는 데이터로 만든다.

  • abstract : 클래스 앞에 명시하면 추상 클래스가 되어 객체 생성이 불가능하다. 접근을 위해서는 상속을 받아야한다. 추상 메서드를 선언만하고 추상 클래스를 상속한 클래스에서 구현한다.

  • transient : 변수 또는 메서드가 포함된 객체를 직렬화( Serialize )할 때 해당 내용은 무시된다.( 데이터를 전송하고 싶지 않을 때 )

  • synchronized : 메서드는 한 번에 하나의 쓰레드에 의해서만 접근이 가능하다.( 비동기식 처리 )

  • volatile : 자바 변수를 메인 메모리에 저장하겠다라는 것을 명시함.

메서드

메서드는 해당 객체의 행위( 동작 )을 나타낸다. 자바에서 모든 메서드가 클래스에 존재하여 모든 함수가 메서드라고 볼 수 있다.

인스턴스 메서드( instance method )

  • 인스턴스와 연관된 작업을 하는 메서드로 인스턴스 생성 후 사용 가능하다. 인스턴스 메서드 내부에서 클래스 변수와 인스턴스 변수 모두 사용이 가능하다.

클래스 메서드( static method )

  • static 키워드를 가지고 있는 메서드는 인스턴스를 생성하지 않아도 사용할 수 있다. 클래스 메서드 내부에서는 인스턴스 변수를 사용할 수 없고 클래스 변수와 지역변수만 사용가능하다.

메서드 정의

public class Book {
    public void b1() {
        // 메서드 내용
    }
    
    public void b2() {
        // 메서드 내용
    }
}
  • 메서드 이름 : 메서드명은 동사여야하며, 낙타체를 사용해야한다.

  • 메서드 시그니처 : 메서드 이름과 매개변수 리스트를 메서드 시그니처라고 부른다. 컴파일러는 메서드 시그니처를 보고 구별할 수 있기 때문에 메서드 오버로딩( method overroding )을 지원한다.
    반환 타입은 메서드 시그니처가 아니어서 반환 타입만 다른 경우에는 오버로딩이 불가능하다.

생성자( constructor )

인스턴스를 생성해주고 클래스의 객체를 초기화하는데 사용되는 특수한 메서드이다.
메서드와 달리 반환 값이 없기 때문에 return도 사용하지 않는다.
클래스와 이름이 같아야하며 최소 1개 이상의 생성자를 가질 수 있다. 만약, 생성자가 한개도 생성되지 않는다면 default 생성자를 자동으로 추가한다.

public class Book {
    private String b1;
    
    // default 생성자
    public Book() {
        b1 = "book1";
    }
    
    // 여러가지 파라미터를 받을 수 있다.
    public Book(String variable) {
    // 파라미터를 이용한 인스턴스 변수 초기화
        this.b1 = variable;
    }
}

this

this는 인스턴스 자기 자신을 가리키는 명령어이다. 인스턴스가 생성되지 않고도 사용할 수 있어서 클래스 메서드에서는 this를 사용할 수 없다.

클래스의 속성과 매개변수의 이름이 같을 때 사용할 수 있다.

public class Book {
    private String b1;

    public Book(String variable) {
        this.b1 = variable;
    }
}

객체 자신의 참조 값을 전달하고 싶을 때 사용할 수 있다.( getter & setter )

public class Book {
    private String b1;

    public Book(String variable) {
        this.b1 = variable;
    }
    
    public Book getBookName() {
        return this;
    }
}

this()는 해당 클래스의 생성자를 호출할 수 있다. 생성자를 재사용하는데 쓰인다.( 생성자 체이닝 )

public class Book {
    private String b1;

    public Book(String variable) {
        this.b1 = variable;
    }
    
    public Book(String a, String b) {
        this(a);
        this.b1 = b;
    }
}
profile
장래희망 : 침대 위 녹아든 치즈

0개의 댓글