객체 지향 프로그래밍(OOP - Object Oriented Programming)

  • 필요한 데이터와 코드를 묶어 하나의 객체로 만들고 이 객체들 간에 상호작용을 하도록 프로그램을 만드는 방식입니다.
  • 부품에 해당하는 객체를 만들고, 객체를 조립해서 완성된 프로그램을 만듭니다.

특징

  • 캡슐화 : 객체의 데이터와 메소드를 묶어 외부 접근을 제한하고 데이터를 보호
  • 상속 : 한 클래스가 다른 클래스의 특성을 받아와 코드 재사용성을 높이고 구조를 계층적으로 조직화
  • 다형성 : 같은 인터페이스나 메소드 호출이 다양한 객체에 대해 다른 실행결과를 낼 수 있게 하여 프로그램
    의 유연성을 제공
  • 추상화 : 복잡성을 관리하고 필수적인 특성을 강조하여 프로그램의 확장성과 유연성을 증진

객체

  • 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것입니다.
  • 속성(필드), 동작(메소드)로 구성
  • 다른 객체와 객체의 동작인 메소드를 이용해서 서로 상호작용을 합니다.
  • 메소드를 호출함으로써 다른 객체에게 정보를 넘겨줍니다.

클래스

  • 사용자가 정의하는 자료형
  • 인스턴스화 : 클래스로부터 객체를 만듦
  • 인스턴스 : 클래스로부터 만들어진 객체
    --> 클래스로부터 여러개의 인스턴스를 만들 수 있습니다.

-> 이때 변수는 객체이다. 클래스의 인스턴스

클래스의 구조

  • 필드(변수) : 클래스 내에서 값을 저장하는 변수
  • 메소드 : 객체 동작으로 호출 시 실행하는 블록, 객체 내부의 함수
  • 생성자 : 클래스 이름과 동일한 이름을 갖는 특별한 종류의 메소드, 객체의 초기화 담당, 객체가 생성될 때 자동으로 호출되는 메소드

1️⃣ 필드 선언

  • 클래스 블록에서 선언되어야 필드 선언이 됩니다.
  • 필드의 초기값을 할당하지 않으면 자동으로 기본 값으로 초기화됩니다.

2️⃣ 필드 사용

  • 필드는 객체 내부 데이터이므로 객체가 존재해야 필드를 사용할 수 있습니다.
  • 즉, 클래스로부터 객체를 생성한 후 필드에 접근할 수 있습니다.

3️⃣ 메소드의 기본구조

생성자

  • 생성자의 이름은 클래스의 이름과 같아야 합니다.
  • 리턴 타입을 적지 않습니다.

패키지

  • 소문자로만 작성하는 것이 관례입니다!
  • 같은 패키지에 있는 클래스는 아무 조건 없이 사용가능합니다.
  • 다른 패키지에 있는 클래스는 import문으로 어떤 패키지의 클래스인지 명시 해야합니다.

접근 제어자

  • 클래스나 일부 멤버(필드, 메소드)를 외부에서의 접근을 제한하는 것입니다.

  • 중요한 필드나 메소드가 외부로 노출되지 않도록 하기 위함입니다.

  • public : 패키지에 관계없이 모든 클래스에서 접근 가능

  • protected : 같은 패키지 내의 모든 클래스에서 접근 가능(다른 패키지에서 접근 불가)
    단, 다른 패키지에 있더라도 상속 받은 서브클래스에서는 접이 가능하다

  • default : 같은 패키지 내의 모든 클래스에서 접근이 가능(다른 패키지에서 접근 불가)

  • private : `같은 클래스에서만 접근 가능

getter, setter

  • 클래스에서 필드(변수)는 private로 지정하는 것이 일반적입니다.
    why? 외부에서 데이터를 변경한다면 무결성이 깨지게 되기 때문이죠.
    그렇다고 해서 private으로 선언하면 다른 클래스에서 접근하지 못하는 것이 되어서, 간접적으로 필드에 접근할 수 있도록 public 메소드를 제공합니다.
    ➡️ 이를 getter,setter
    ➡️ 데이터의 직접적인 변경을 막고, 메소드를 통해 필드에 접근하는 것을 선호합니다.
    getter : 필드 값을 가져올 때
    setter : 필드 값을 설정할 때

getter,setter 생성법

  • 일일히 굳이 만들지 않고 아래의 순서로 하면 원하는 필드의 getter,setter를 생성할 수 있습니다.
    우측클릭 ➡️ source ➡️ Generate getters and Setters ➡️ 원하는 필드 선택

static 멤버(변수, 메소드)

  • 객체마다 생성되는 것이 아니고, 클래스당 하나만 생성됩니다.
  • 클래스가 생성되는 순간에 메모리를 할당받습니다.
  • 즉, 객체를 생성하지 않아도 static 멤버에 접근이 가능합니다.
  • 동일한 클래스의 모든 인스턴스에 공유되어서 같은 메모리 공간을 공유합니다.
  • 보통 static 변수는 공유의 목적으로 자주 사용됩니다.
public static int COUNT = 0;
  • 유틸리티성 메소드를 작성할때 많이 사용됩니다.
    : 오늘의 날짜 구하기, 숫자에 콤마 추가하기 등..Math 클래스
public final class Math{
	public static int abs(int a);
    public static int max(int a, int b);
    
    ...
}
//사용시엔
int n = Math.abs(-5);

final 필드선언

  • 읽기만 허용되고 값이 변경되면 안되는 경우에 사용 됩니다.
  • 한번만 초기화할 수 있고, 초기화 된 값이 최종값

상수 선언

  • 상수는 변하지 않는 값을 의미합니다.
  • 상수는 객체마다 저장할 필요 없고, 단 한번만 값이 선언되면 되기 때문에 static이면서 final인 특성을 가집니다.
  • 대문자로 작성하는 것이 관례입니다.

static final 타입 상수 [=초기값]; static final double PI = 3.141592; static final String HI = "Hello";

profile
중요한 건 꺾여도 다시 일어서는 마음

0개의 댓글