4 분 소요

❗ 모든 내용 업로드 X

🔮 객체 지향 언어의 특성

캡슐화

객체를 캡슐로 싸서 내부를 보호하고, 볼 수 없게 하는 것이다. 클래스 라는 캡슐에 멤버 필드와 메소드가 있다. 클래스를 통해서 클래스 안에 있는 멤버 필드와 메소드가 직접적으로 노출되지 않게 하여 정보 손상, 오용을 방지하고 있다.

상속

자식 클래스가 부모 클래스의 속성을 물려받고 기능을 추가하여 확장(extends) 하는 개념이다. 부모의 클래스를 슈퍼 클래스라고 부르며 자식 클래스를 서브 클래스라고 부른다. 슈퍼 클래스로부터 필드와 메소드를 물려받아 코드를 재사용함으로써, 코드 작성에 드는 시간과 비용을 줄인다.

다형성

같은 이름의 메소드가 클래스 혹은 객체에 따라 다르게 동작하도록 구현되는 것을 말한다. 예시로 오버 로딩과 오버 라이딩이 있다. 오버 로딩과 오버 라이딩은 다형성 실현이 목적입니다.

  • 오버로딩 같은 이름의 메소드이더라도 매개 변수의 개수와 데이터 타입에 따라서 다르게 동작할 수 있도록 하는 경우입니다.
  • 오버 라이딩 상속 관계인 두 클래스에서 같은 이름을 가지고 있는 메소드를 자식 클래스에서 재정의하는 경우입니다.

🔮 객체 지향 언어의 목적

  • 소프트웨어의 생산성 향상

  • 실세계에 대한 쉬운 모델링

🔮 절차 지향 프로그래밍과 객체 지향 프로그래밍

  • 절차 지향 프로그래밍 실행하고자 하는 절차를 정하고 이 절차대로 프로그래밍 진행. 흐름도를 설계하고, 흐름도상의 동작들을 함수로 작성하며, 흐름도에 따라 일련의 동작들을 순서대로 실행되도록 작성한다.
  • 객체 지향 프로그래밍 실제 세상의 물체를 객체로 표현, 객체들의 관계, 상호 작용을 설계한 뒤, 각 객체를 클래스로 작성하면 프로그램이 완성된다.

🔮 클래스와 객체

📍 객체

모든 객체는 자신이 가지고 있는 특성과 행동이 있으며, 객체들은 모두 상호작용을 하면서 존재한다. 쉽게 말해서 게임으로 예를 들자면 게임에 있는 여러 종류의 아이템, 챔피언, 백그라운드가 있다.

📍 클래스

객체를 만들어 내기 위한 설계도 혹은 틀이며, 클래스 모양 그대로 생성된 실체가 객체이다. 예를 들어서 item.class 안에 멤버 필드로 금액, 추가 공격력, 추가 마법력, 방어력이 있다면 이를 통해서 만들어진 객체는 솔라리, 마관신, 존야, 물약, 영겁 등이 있는 것이다. 그래서 객체들의 공통점을 찾아서 클래스 파일을 만드는 것이다.

📍 객체와 클래스의 관계

클래스는 하나의 틀이라고 생각을 하고, 이 클래스를 통해서 만들어진 인스턴스들이 객체라고 볼 수 있다. 그래서 클래스는 하나라도 객체는 여럿이 될 수 있다.

Ex.

  • Student.java -> 클래스로 사용
  • Main -> Student sookyoung = new Student(); 를 통해서 sookyoung의 객체를 만든 것이 된다.

🔮 클래스 구성

//Circle.java
public class Circle {
  public int radius;
  public String name;

  public Circle() {
  }

  public double getArea() {
    return 3.14 * radius * radius;
  }
}
  • Circle 클래스
    • 필드 (멤버 변수)
    • 메소드(멤버 함수)
  1. 클래스 선언 class Circle
    class 키워드와 클래스 이름으로 선언하고, 그 안에는 필드와 메소드를 작성한다. 클래스 외의 외부 클래스의 필드나 메소드를 둘 수 없다. 캡슐화 원칙 때문에.
  2. 필드와 메소드
    필드 : 추상화 과정에서 명사에 해당
    메소드 : 추상화 과정에서 동사에 해당
  3. 접근 지정자
    public은 외부 클래스에서 활용하거나 접근이 가능하다.
  4. 생성자

🔮 생성자

📍 new 연산자 / 객체 생성 / 레퍼런스 변수

  • Circle pizza; : Circle 객체에 대한 레퍼런스 변수인 pizza 선언(메모리 할당 X), 가리키고 있는 주소는 null 인 상태
  • pizza = new Circle(); : Circle 객체 생성 및 객체 메모리 할당

🧮 용어 정리

  • 레퍼런스 변수 : pizza를 의미하며, Circle 클래스의 객체에 대한 주소 를 가지는 변수일 뿐, 객체 자체는 아니다.
  • new 연산자 : 레퍼런스를 레퍼런스 변수에 대입한다. new를 사용하게 되면 레퍼런스 변수는 null에서 Circle 객체의 레퍼런스로 주소가 바뀌게 된다. 그리고 Circle 타입 크기의 메모리가 할당되고 radius와 name 필드는 초기화되지 않은 상태로 생성되었다.
  • 생성자 : new 연산자를 통해서 객체 크기의 메모리가 생성될 때, 필드의 값을 초기화시킬 수 있다.

📍 생성자 특징

  1. 생성자의 이름은 클래스 이름과 동일하다.
  2. 생성자는 여러 개 작성(오버로딩)할 수 있다.
  3. 생성자는 new를 통해 객체를 생성할 때 한 번만 호출된다.
    👉 호출하고 싶을 때 아무 때나 호출할 수 있는 메소드가 아니다.
  4. 생성자에 리턴 타입을 지정할 수 없다.
  5. 객체 생성시 필요한 초기 작업을 위함이다.

주의 : 생성자를 하나라도 선언할 시 디폴트 생성자를 삽입해주지 않는다.

🔮 this 레퍼런스

객체 자신을 가리키는 레퍼런스이다. 즉 현재 실행되고 있는 객체에 대한 레퍼런스

public Human(String name, int age, int height, String career) {
    this.name = name;
    this.age = age;
    this.height = height;
    this.career = career;
}

이런식으로 생성자를 만들 때 자주 사용. 또는 객체 자기 자신을 리턴해야 될 때, return this; 이런식으로 사용

🔮 this() 메소드

생성자가 다른 생성자를 호출할 때 사용하는 자바 코드이다.

public Student2(String name, int age, int height, int studentID) {
    this(name, age, height, "Student", 2116313);
}

public Student2(String name, int age, int height, String career, int studentID) {
    this.name = name;
    this.age = age;
    this.height = height;
    this.career = career;
    this.studentID = studentID;
}

Student2 라는 생성자 2개가 있다. 여기서 메인에 매개변수가 String, int, int, int인 경우 첫 번째 생성자가 호출된다. 그리고 this()를 통해서 해당 생성자 중 매개 변수에 맞는 생성자를 호출한다.

  • 사용 규칙
    • 반드시 생성자 코드에서만 호출 가능
    • 반드시 클래스 내 다른 생성자를 호출할 때 사용
    • 반드시 생성자의 첫 번째 문장이 되어야 됨.

🔮 객체 배열 -> 정리 필요

🔮 패키지

서로 관련 있는 클래스 파일들을 모아놓은 디렉터리 혹은 폴더 같은 개념

🔮 접근 지정자

  1. 클래스 기준
  • public 클래스 패키지에 상관 없이 다른 어떤 클래스에게도 사용 가능
  • 디폴트 클래스 같은 패키지 내의 클래스 사용 가능
  1. 멤버 기준
  • public 멤버 모든 패키지, 모든 클래스 사용 가능
  • 디폴트 멤버 동일 패키지, 자식 클래스 사용 가능
  • private 멤버 클래스 내에서만 사용 가능
  • protected 멤버 동일 패키지 내, 자식 클래스 X 사용 가능

🔮 static 멤버

static 멤버는 객체가 생성되기 전에 이미 code segment에 들어가 있기 때문에 객체를 생성하지 않고 사용할 수 있는 멤버이다. static 멤버가 정의된 클래스가 있다면 이를 통해 만들어진 객체들은 static 멤버를 공유한다. c에서 전역 함수, 전역 변수라고 보면 된다.

🔮 final

말 그대로 최종! 더이상 수정되지 않는 값

  • final 클래스 : 클래스 이름 앞에 사용되면 클래스를 상속받을 수 없음 을 지정합니다. class 앞에 키워드가 사용됩니다.
  • final 메소드 : 오버라이딩을 할 수 없는 메소드 를 선언합니다. 메소드 이름 앞에 사용됩니다.
  • final 필드 : 값을 수정할 수 없으므로 상수 를 의미합니다. 필드 가장 앞에 사용됩니다.

댓글남기기