본문 바로가기

Java

Java 기초 다지기 - 객체지향 특성 ( 인터페이스를 곁들인 )

이것저것 만지다 보니 Java 기초 문법을 아차 할 때가 있는데 다시 다져보는 시간을 가져야겠다. (많아서 따로 다 빼야겠다.)

 

Java는 진짜 모두가 알거같은데 객체 지향적 프로그래밍 언어이다. 정리했었던 거 같은데 다시 간단하게 말하면 데이터와 데이터를 처리하는 메서드를 하나의 객체로 묶어서 프로그래밍하는 방식이다. 

 

1. 객체지향의 특성

  • 캡슐화 (Encapusulation) - 관련된 기능과 관련된 데이터를 하나의 클래스로 묶어서 사용한다.
    • 접근에 제한 설정이 가능하다.
    • public (+) : 모든 패키지에서 접근 가능
    • protected (#) : 같은 패키지 내에서만 접근이 가능하나 상속 받은 객체에서는 접근 가능
    • default : 같은 패키지 내에서만 접근 가능
    • private (-) : 클래스 내부에서만 접근 가능
  • 상속 (Inheritance) - 부모로부터 상속받은 변수나 메소드를 자식이 재사용 가능하다.
    • 자바는 단일 상속만 지원한다.
    • 자바의 모든 class는 Object 클래스의 후손이다.
    • 부모의 생성자와 초기 블록은 상속되지 않는다.
    • 부모의 private 멤버는 상속은 되지만 직접 접근이 불가능하다.
  • 추상화 (Abstraction) - 객체에서 공통된 속성과 행위를 추출한다. 
    • 추상 클래스에서 선언부만 작성하고 하위 클래스에서 구현한다. (유연성)
    • 추상 클래스는 객체 생성이 불가하다. (new class 불가)
    • 인터페이스와 비슷하지만 인터페이스가 더 높은 추상성을 가진다. 추상클래스는 설계도 인터페이스는 밑그림)
  • 다형성 (Polymorphism)
    • 오버라이딩(Overriding) - 부모 클래스의 메소드 재정의
    • 오버로딩(Overloading) - 다른 매개 변수를 가진 같은 이름의 메서드 여러 개 정의

2. 클래스, 인스턴스, 생성자

class Person{
    String name;

    String hi(){
        return "내 이름은 " + name;
    }
}

public class Main {
    public static void main(String[] args) {
        Person aa = new Person(); // 객체가 생성되는 순간 메모리에 할당 된다.
        aa.name = "aa";
        System.out.println(aa.hi()); // 내 이름은 aa
        
        Person bb = new Person();
        bb.name = "bb";
        System.out.println(bb.hi()); // 내 이름은 bb
    }
}

 

  • Person이 클래스(객체 속성 정으)이고, aa와 bb가 인스턴스(클래스로부터 만들어진 객체)이다. 
  • 인스턴스가 생성될 때 자동으로 생성자가 호출되며 필드값들을 초기화한다.
  • 생성자를 따로 선언하지 않아도 매개변수와 내용이 없는 기본 생성자가 생성된다.

3. super / super() / this / this()

  • super - 부모 클래스의 멤버변수 지정
  • super() - 부모 클래스의 생성자 호출
  • this - 자신의 멤버변수 지정 
  • this() - 자신의 다른 생성자 호출

4. 추상 클래스와 인터페이스 차이

  • 둘 다 비슷하지 않은가? 어쨋든 하위 클래스에서 구현하잖아? 인스턴스 생성이 불가하고.. 그런데 뭐가 다른가 싶어야 한다. 내가 그러니까..
  추상 클래스 인터페이스
다중상속 불가능 가능
추상 메서드 0개 이상 모두 public abstract (생략 가능)
일반 메서드 가능 불가능(JDK 1.8부터 static과 default 메서드 사용 가능)
필드 일반 변수, 상수 모두 가능 public static final (생략 가능)
상속 키워드 extends implements
  • 다중상속 말고는 인터페이스가 굳이 있어야 싶지 않나요. (전 아직 멀었나봐요)
  • 추상 클래스는 상속할 각 객체들의 공통점을 찾아 추상화 시켜 놓은 것이고, 인터페이스는 서로 관련이 없는 클래스들을 묶어주고 싶을때 사용한다.
  • 진짜 사람들은 기가 막히는 예제들을 보여준다..  아래와 같은 상속 관계가 있다고 치자
abstract class Creature{} // 조상 클래스

abstract class Animal extends Creature {} // 부모 클래스 (추상 클래스)
abstract class Fish extends Creature {} 

class People extends Animal {} // 자식 클래스
class Parrot extends Animal {}

class Whale extends Fish {}

 

  • Swimming()이라는 동작을 하는 메서드를 추가해야 하는데 수영은 사람과 고래만 할 수 있다. (앵무새는 못 한다고 가정) 그럼 사람과 고래를 포함하는 Creature 추상 클래스에 추상 메소드를 추가해야 한다. 근데 그러면 자식 클래스에선 부모의 추상 메소드를 무조건 구현해야 하니까 수영을 못하는 Parrot 클래스에서도 강제로 메소드를 구현해야 한다. 빈칸으로 놔두면 되지만 이는 객체지향 설계에 위반되며 유지보수에도 좋지 않다.
  • 이때 인터페이스에 Swimming()이라는 추상 메소드를 선언하면? 동작이 필요한 클래스에만 따로 상속할 수 있다! 수영뿐만 아니라 다른 동작들도 인터페이스에 추상 메소드로 작성하고, 필요한 동작들을 자유롭게 상속시키면?
abstract class Creature{} 

abstract class Animal extends Creature {} 
abstract class Fish extends Creature {} 

interface Talkable{
	void talking();
}

interface Swimmable{
	void swimming();
}

class People extends Animal implements Talkable{
    @Override
    public void talking(){}
} 
class Parrot extends Animal implements Talkable, Swimmable{
    @Override
    public void talking(){}
    @Override
    public void swimming(){}
}

class Whale extends Fish implements Swimmable{
    @Override
    public void swimming(){}
}
  • 정리하자면 추상 클래스는 관련성이 높은 클래스들이 상속받아 구현하고, 인터페이스는 관련성이 없는 클래스들이 동작들을 상속 받아서 구현할 때 쓰인다!

참고 출처

https://s-bug.tistory.com/57#3.%20%EA%B0%9D%EC%B2%B4%20%EC%A7%80%ED%96%A5%204%EB%8C%80%20%ED%8A%B9%EC%84%B1%E2%9C%85-1

 

Java (자바) :: 자바의 특징 7가지 OOP특성 4대 특성

1. 자바(Java)란 무엇인가?✅ 1995년에 발표된 자바는 썬 마이크로시스템즈의 제임스 고슬링(James Gosling)과 다른 연구원들이 개발한 객체 지향적 프로그래밍 언어이다. 처음에는 가전제품 내에 탑재

s-bug.tistory.com

☕ 인터페이스 vs 추상클래스 용도 차이점 - 완벽 이해 (tistory.com)

 

☕ 인터페이스 vs 추상클래스 용도 차이점 - 완벽 이해

인터페이스 vs 추상클래스 비교 이 글을 찾아보는 독자분들은 아마도 이미 인터페이스와 추상클래스 개념을 학습한 뒤에 이 둘에 대하여 차이의 모호함 때문에 방문 했겠지만, 그래도 다시한번

inpa.tistory.com

 

 

 

'Java' 카테고리의 다른 글

static과 final  (1) 2024.06.05
Class, Object, Instance  (0) 2024.06.05
Java 메모리 - Stack, Heap, Method(Static)  (0) 2024.06.03
Java 자료구조 - 배열과 리스트  (0) 2024.06.02
Java 기초 다지기 - 문자열  (1) 2024.06.02