본문 바로가기
스터디일지/JAVA

[2023.08.15 ~ 16] 자바 문법 3주차 강의

by 똥쟁이핑크 2023. 8. 16.

→2023.08.01 - [스터디일지] - [2023.08.01] 자바 객체 지향 프로그래밍

 

객체지향프로그램밍

  • 설계도를 만들어야 한다 → 클래스 선언하기
  • 속성을 정의해야 한다 → 객체가 가지고 있어야 할 것들을 만들어야 한다. 필드라 한다.
  • 방식을 정해야 한다 → 생성자를 만들어서 객체를 생성하는 방식을 만들어야 한다.
  • 행위를 정해야 한다. → 메서드를 만들어야 한다. 여기서 객체가 가지고 있어야 할 것들을 정의해야 한다.
  • 위의 4가지를 가지고 캡슐화, 상속, 추상화, 다형성을 할 수 있게 된다.

 

객체란?

  • 세상에 존재하는 식별이 가능한 모든 것을 말한다.
  • 속성과 행위로 구성된다.
  • 객체의 상호작용은 메서드를 통해 이루어진다. → 메서드를 호출하고 값을 주고받을 수 있다.
  • 객체를 생성하려면 new를 사용해서 생성한다.
  • 객체는 참조형 변수와 동일하게 취급되니 배열이나 컬렉션에도 저장하여 관리가 가능하다

 

필드란?

  • 객체의 속성을 말하고 객체의 데이터를 저장한다.
  • 필드를 변경하는 것은 값을 변경하거나 읽는 것을 의미한다
  • 초기값을 지정하지 않으면 객체가 생성될 때 기본 값으로 초기화되는데 데이터 타입에 따라 초기화된다.
  • 사용할 때는 인스턴스화해야 한다.
  • 접근하기 위해서는 2가지 방법이 있다.
  • 외부 - Car car = new Car(); 이런 식으로 사용할 수 있다.
  • 내부 - 메서드 호출로 사용할 수 있다.

 

메서드란?

  • 객체의 행위를 뜻한다. 행위를 정의할 때는 { } 안에 코드를 작성한다.
  • 리턴타입을 사용하여 만들어야 한다 - 반환값이 없을 때 리턴 타입을 void로 작성한다.
  • 입력하기 - 매개변수를 사용하여 값을 전달받을 때는 타입을 지정해야 한다. - 입력하는 순서와 타입을 맞춰야 한다.
  • 호출하기 - 메서드 명을 사용하여 호출할 수 있다. - 외부 내부에서 접근할 수 있다.

 

메서드 오버로딩

  • 메서드 명은 같으나 매개변수를 다르게 지정하면서 기능을 다르게 할 수 있다. - 매개변수의 차이가 있다
  • 사용조건
    1. 메서드 이름은 같고 매개변수의 개수, 타입, 순서가 달라야 한다.
    2. 응답값이나 접근제어자만 다른 경우는 오버로딩을 할 수 없다.
    3. 결론은 매개변수의 차이로 구현이 가능하다
  • 장점
    • 같은 메서드 이름으로 상황에 따른 동작을 개별로 구현할 수 있다.
    • 메서드 이름이 절약된다고 한다.

 

인스턴스 멤버와 클래스 멤버

  • 멤버는 필드와 메서드로 이루어져 있다
  • 멤버를 선언하는 방식에 따라 인스턴스와 클래스로 구분한다.
  • 클래스 멤버는 객체 생성 없이 사용가능하고 인스턴스멤버는 객체를 생성한 후에 사용이 가능하다.
  • 클래스 멤버 선언은 static 키워드를 사용해서 선언하고 공용적인 데이터를 저장하는 필드를 클래스 멤버로 선언하는 것이 좋다.
  • 클래스 멤버로 선언된 메서드는 인스턴스 멤버를 사용할 수 없지만 인스턴스 멤버로 선언된 메서드는 클래스 멤버를 사용할 수 있다. → 인스턴스 멤버는 객체를 생성해야 하기 때문이다.

 

생성자

  • 생성자의 역할은 객체를 생성할 때 객체를 초기화하는 역할을 한다.
  • 반환 타입이 없고 클래스이름과 같다.
  • new를 사용하여 객체가 생성되면 호출된다.
  • 모든 클래스는 생성자가 하나 이상 존재한다. → 생성자가 하나도 없으면 바이트 코드 파일에 자동으로 추가된다.

 

this와 this()

  • this
    • 인스턴스 자신을 가리킬 때 쓰는 키워드다.
    • 객체 내부 멤버에 접근하기 위해 쓰지만 상황에 따라 적용하면 된다.
  • this()
    • 인스턴스 자신의 생성자를 호출할 때 쓴다.
    • 생성자를 통해서 필드를 초기화하게 되는데 이러면 중복되는 코드를 줄일 수 있다.
    • 반드시 생성하려는 생성자의 첫 줄에 적어야 한다.

 

접근제어자

  • 하나씩만 사용가능하다
  • public, protected, default, private 이렇게 4개의 접근제어자가 있다.
    • public - 접근의 제한이 없다.
    • protected -  같은 패키지 내에서 다른 패키지의 자손 클래스에서 접근할 수 있다.
    • default - 같은 패키지 내에서만 접근이 가능하다.
    • private -  같은 클래스 내에서만 접근이 가능하다.
  • 클래스에서는 public, default를 사용할 수 있고 메서드와 멤버변수에서는 접근 제어자 4개를 사용할 수 있다.
  • 사용하는 이유는 데이터를 보호하기 위함이고 함부로 변경하지 못하게 값을 유지하기 위해 사용한다.
  • private 한 필드를 사용하려면 Getter(읽을 때)와 Setter(저장하거나 수정할 때)를 사용해야 한다.
접근제어자와 그 외 제어자(빨간 글씨끼리는 동시에 사용 할 수 없다)
클래스 public, default, final, abstract
메서드 public, protected, default, private, final, abstract, static
멤버변수 public, protected, default, private, final, static
지역변수 final

 

 

상속

  • 부모 클래스의 필드와 메서드를 자식 클래스에게 물려주는 것이다
  • 코드의 중복이 줄고 재사용성이 증가한다. → 생산성과 유지보수성에 유리하다.
  • 클래스의 상속은 extends 키워드를 쓸 수 있는데 public class 자식클래스 extends 부모클래스, 이렇게 사용할 수 있다.
  • 상속할 때 부모 클래스는 영향을 안 받기 때문에 자식 클래스에 필드와 메서드를 추가해서 사용 할 수 있다.
  • 다중상속을 허용하지 않는다.

 

오버라이딩

  • 부모 클래스에서 상속받은 메서드를 재 정의 하는 것이 오버라이딩이다.
  • 재정의 하는 것은 자식 클래스에서 상황에 맞게 변경이 가능하다는 것이다.
  • 메서드는 부모클래스의 메서드와 일치해야 한다.
  • 접근제어자를 사용할 때도 부모클래스보다 좁은 범위로 변경할 수 없다.
  • 메서드는 부모클래스보다 많이 선언할 수 없다.
  • super,  super() = this - 인스턴스,  this() - 생성자
  • super는 부모클래스의 멤버를 참조할 때 사용한다. → 부모 클래스에 접근할 때 사용한다.
  • super()는 부모클래스의 생성자를 호출할 때 사용한다. → 자식 클래스에서 사용할 때는 부모클래스를 먼저 초기화해서 사용해야 한다.

 

 

다형성

  • 여러 가지 형태를 가질 수 있는 능력을 말한다. 

 

추상클래스

  • 미완성된 설계도라 생각하면 된다.
  • abstract 키워드를 써서 추상 클래스를 선언한다.
  • 추상메서드를 포함할 수 있다.   미완성된 메서드고 abstract를 사용하여 선언이 가능하다. → 정의만 하고 실행 내용이 없어서 { } 중괄호가 없다.
  • 자식 클래스에 의해 완성이 된다.

 

인터페이스

  • 객체를 연결해 준다.
  • 상속관계가 아닌 서로 다른 클래스들에 동일한 메서드를 구현해야 할 때 사용한다.
  • interface라는 키워드를 사용한다.
  • 멤버 변수는 public, static, final 이어야 한다. 생략하면 컴파일러가 자동으로 추가한다.
  • 메서드는 public, abstract 이어야 한다. → 생략하면 컴파일러가 자동으로 추가한다.
  • 인터페이스 구현시 구현체가 있어야 한다. → implements를 써야 한다. → 오버라이딩이 반드시 되어야 한다.
  • 일부분만 구현해야 한다면 추상 클래스로 변경해야 한다.
  • 인터페이스는 일반클래스와는 다르게 다중 상속이 가능하다. → 상속 시 사용하는 키워드는 extends다.
  • 다형성이 적용될 수 있다.