TIL #10-2

DuBu·2023년 6월 21일
0

일본IT JAVA 연수과정

목록 보기
16/61
post-thumbnail

Package

  • 패키지를 만들면 똑같은 이름의 파일을 사용할 수 있다.
  • 패키지 이름은 모두 소문자로 구성
  • 인터넷 도메인 이름의 역순으로 이름을 구성
  • 이름 끝에 클래스를 정의한 주체 또는 팀의 이름 추가
  • 동시에 같은 이름의 클래스를 가지고 있는 패키지를 사용할 때 첫번째 패키지는 import 할 수 있으나 두번째는 해당 객체와 클래스에 패키지명을 적어줘야 한다.

객체 지향 프로그래밍(OOP)

객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발 방법론 중 하나로, 프로그램을 객체들의 집합으로 모델링하고 객체 간 상호작용을 통해 프로그램을 구성하는 방식입니다. 객체 지향 프로그래밍의 주요 특징은 다음과 같습니다:

  1. 캡슐화 (Encapsulation):

    • 관련된 데이터와 기능을 하나의 단위로 묶고, 외부로부터의 접근을 제어하는 것을 의미합니다.
    • 클래스는 데이터를 캡슐화하여 내부 상태를 보호하고, 외부에서는 제공된 인터페이스를 통해 상호작용할 수 있습니다.
    • 캡슐화를 통해 코드의 모듈성과 유지보수성이 향상됩니다.
  2. 상속 (Inheritance):

    • 클래스 간의 계층적인 관계를 구성하여 코드의 재사용성을 높입니다.
    • 부모 클래스(상위 클래스)의 특성과 동작을 하위 클래스(파생 클래스)가 상속받아 사용할 수 있습니다.
    • 상속을 통해 코드 중복을 줄이고, 클래스 간의 관계를 명확하게 표현할 수 있습니다.
  3. 다형성 (Polymorphism):

    • 동일한 이름의 메소드나 연산자가 다양한 객체에서 다양한 방식으로 동작할 수 있는 능력을 말합니다.
    • 다형성을 통해 객체의 타입에 따라 다른 동작을 수행하도록 구현할 수 있습니다.
    • 상속과 인터페이스를 기반으로 다형성을 구현할 수 있습니다.
  4. 추상화 (Abstraction):

    • 복잡한 시스템을 단순화하여 필요한 기능에 집중할 수 있도록 합니다.
    • 객체들의 공통된 특성을 추출하여 클래스나 인터페이스로 정의하는 과정을 의미합니다.
    • 추상화를 통해 복잡성을 숨기고, 개념적 모델을 구축할 수 있습니다.
  5. 객체 지향 설계 (Object-Oriented Design):

    • 객체들의 상호작용을 중심으로 소프트웨어를 설계하는 접근법을 말합니다.
    • 객체 간의 관계와 역할, 책임을 고려하여 시스템을 구조화하고 구현합니다.
    • 객체 지향 설계를 통해 유연하고 확장 가능한 소프트웨어를 개발할 수 있습니다.

객체 지향 프로그래밍은

현실 세계의 개념과 모델링을 반영하여 소프트웨어를 구축하는 강력한 패러다임으로 널리 사용되고 있습니다. 이를 통해 코드의 가독성, 재사용성, 유지보수성 등을 개선할 수 있습니다.

정보 은닉

정보 은닉은 객체 지향 프로그래밍의 특징 중 하나입니다. 정보 은닉은 객체의 내부 상태와 구현 세부 사항을 외부로부터 감추는 것을 의미합니다. 이를 통해 객체의 데이터를 보호하고 오용을 방지할 수 있습니다.

정보 은닉은 캡슐화를 통해 구현되며, 객체의 내부 데이터에 직접 접근하는 것을 제한하고, 외부에서는 제공된 인터페이스를 통해 객체와 상호작용합니다. 이로써 객체의 내부 구현이 변경되어도 외부 코드에 영향을 최소화할 수 있습니다. 또한, 정보 은닉은 코드의 모듈성과 유지보수성을 향상시키며, 객체 간의 결합도를 낮추어 시스템의 유연성을 높입니다.

정보 은닉은 객체 지향 프로그래밍의 중요한 특징 중 하나이며, 객체의 내부 상태를 보호하고 객체 간의 결합도를 관리하는 데 도움을 줍니다.

  • 활용 예시
public class Person {
    private String name; // private으로 선언된 멤버 변수

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name; // 외부에서는 getName() 메소드를 통해 name 변수에 접근
    }

    public void setName(String name) {
        this.name = name; // 외부에서는 setName() 메소드를 통해 name 변수를 변경
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person("John");
        System.out.println(person.getName()); // "John" 출력

        person.setName("Jane"); // 외부에서는 setName() 메소드를 통해 name 변수 변경
        System.out.println(person.getName()); // "Jane" 출력

        // 다음과 같이 직접 접근하려고 하면 컴파일 오류가 발생합니다.
        // person.name = "Bob"; // 오류: The field Person.name is not visible
    }
}

위의 예시에서 Person 클래스의 name 멤버 변수는 private으로 선언되어 외부에서 직접 접근할 수 없습니다. 대신, getName() 메소드와 setName() 메소드를 통해 name 변수에 접근하고 변경할 수 있습니다. 이를 통해 Person 객체의 내부 상태를 보호하고 외부에서의 오용을 방지할 수 있습니다.

Main 클래스에서 Person 객체를 생성하고 getName() 메소드를 통해 name 변수의 값을 출력합니다. 또한, setName() 메소드를 사용하여 name 변수의 값을 변경한 후 다시 출력합니다.

person.name = "Bob";과 같이 직접 name 변수에 접근하려고 하면 컴파일 오류가 발생합니다. 이는 정보 은닉의 결과입니다. 외부에서는 제공된 메소드를 통해 객체와 상호작용하므로 객체의 내부 구현이 변경되어도 외부 코드에 영향을 덜 주는 이점을 가집니다.

접근 제어자

접근 제어자(Access Modifiers)는 객체 지향 프로그래밍에서 클래스의 멤버(변수, 메소드, 생성자 등)에 대한 접근 범위를 제어하는 데 사용되는 키워드입니다.

  1. public:

    • public으로 선언된 멤버는 어디서든 접근할 수 있습니다.
    • 다른 클래스에서도 접근이 가능하며, 패키지 내부 및 외부에서도 접근할 수 있습니다.
  2. protected:

    • protected로 선언된 멤버는 동일한 패키지 내의 다른 클래스와 상속 관계에 있는 클래스에서 접근할 수 있습니다.
    • 패키지 외부에서는 상속 관계에 있는 클래스만 접근할 수 있습니다.
  3. default (기본적으로 지정되는 접근 제어자):

    • default로 선언된 멤버는 같은 패키지 내의 다른 클래스에서만 접근할 수 있습니다.
    • 접근 제어자를 명시하지 않으면 default로 간주됩니다.
  4. private:

    • private으로 선언된 멤버는 해당 클래스 내부에서만 접근할 수 있습니다.
    • 다른 클래스나 하위 클래스에서는 직접 접근할 수 없습니다.
  • 클래스 정의 가능한 제어자는 public, default이다.
  • 인스턴스 변수와 메소드 대상은 모든 제어자 전부이다.

이러한 접근 제어자를 사용하여 클래스의 멤버들에 대한 접근을 제한함으로써 정보 은닉을 실현하고, 코드의 모듈성과 보안을 강화할 수 있습니다. 올바른 접근 제어자의 사용은 객체 지향 프로그래밍의 원칙을 준수하고 클래스의 캡슐화를 유지하는 데 도움을 줍니다.

실무 접근 제어자

  • 인스턴스 변수는 무조건 private
  • 기본적인 함수는 public
  • 로컬 변수에서 접근 제어자가 없는 이유는 접근 범위가 애당초 함수 내이므로 의미가 없기 때문이다.

0개의 댓글