TIL / JAVA 2주차(2) / 추상화 / 인터페이스

병아리코더 아카이브·2023년 8월 21일

JAVA

목록 보기
6/20
post-thumbnail

추상화 ( abstract )

OOP 의 4대 특성

  1. 캡슐화 : 다른 사용자에게 데이터 입/출력을 제한 ( 컴퓨터 본체 케이스 - 보호를 해주는 개념 )
  2. 상속 : 나에게 없는 기능을 부모에게서 받아서 내 것 처럼 쓴다.
  3. 추상화 : 공통되는 특징을 추출하여 단순화 시키는 것이다.
  4. 다형성 : 나중에 후술
  • 추상클래스추상메서드로 꼭 구현해야 하는 메서드 등의 규격을 만들 수 있다.

    어떤 물체를 만들 때 이러이러한 규격이 있어야 이 물체다. 라고 했을 때 그 규격들이 추상메서드다.

  • 추상 클래스는 일반 메서드추상 메서드 둘 다 존재 가능하다.
  • 추상 클래스 및 추상 메서드는 abstract 키워드를 사용한다.
  • 추상메서드 는 형태만 있고 몸체 {} 가 없다.
  • 추상클래스를 상속하는 실체클래스(concrete class)추상메서드 의 몸체를 구현해야 한다.
    ( 강제로 @override 를 통해 구현해줘야 한다 )
  • 실체클래스추상클래스 와 상속관계이기 때문에 추상클래스 의 기능을 내것처럼 사용할 수 있다.
  • 추상 클래스는 자식 이외에는 객체화 시킬 수 없다.

추상 클래스의 객체화

추상 클래스는 동작이 정의되어 있지 않은 추상 메소드를 포함하고 있으므로, 인스턴스를 생성할 수 없다.

  1. 추상 클래스는 먼저 상속을 통해 자식 클래스 를 만들고
  2. 만든 자식 클래스에서 추상 클래스의 모든 추상 메소드를 오버라이딩 하고 나서야
  3. 비로소 자식 클래스의 인스턴스를 생성 할 수 있게 된다.

정확하게는 자식클래스가 부모클래스를 상속한다는 것은 부모클래스를 객체화 해서 가지고 있다는 의미다. 그래서 사실 추상클래스(부모클래스)도 자식클래스 내에서 객체화된 상태이다.
다만 자식클래스가 아닌 다른 클래스에서는 객체를 생성할 수 없다.

그동안 사용했던 HttpServlet도 추상클래스였다.
Http 통신에서는 최소 post 와 get 방식에 대해서는 대응 해 줘야 하기 때문에 @override 를 통해 doget(), dopost() 를 사용했다.
이 때 doGet()doPost() 은 추상메서드가 아닌 일반 메서드다.


URL / URI

  • URI : 폴더 구조 /04_AbsClass/use
    -> req.getRequestURI(); 로 불러온다.
  • URL : 서버 주소와 포트 포함 http://localhost:8080/04_AbsClass/use
    ->req.getRequestURL(); 로 불러온다.
    String 변수에 담고 싶으면 toString() 을 사용한다.


불러온 URI 의 /use 부분만 따로 사용하고 싶을 땐

String uri = req.getRequestURI();
String ctx = req.getContextPath();		// URL의 context 경로 반환
String addr = uri.substring(ctx.length());	// sub 도메인 얻기
// substring 을 통해 context 경로 길이부터 끝까지만 남겨놓고 제거

를 통해 앞의 컨텍스트 경로인 /04_AbsClass 를 제거한다.


인터페이스 ( Interface )

  • Interface 는 서로 다른 요소들의 접점을 의미 한다.
  • Interface 도 추상 메서드를 통해 공동 작업 시 규격을 잡아주는 역할을 한다.
  • Interface 는 객체화가 불가능 하다.

인터페이스의 메서드

인터페이스는 원래 추상 메서드 만 받을 수 있다.
그래서 일반메서드abstract 키워드가 생략된 추상 메서드이다.

다만, jdk 1.8 부터 일반메서드, 정적메서드 허용이 되었는데
이때 일반메서드 경우 default 를 추가시켜줘야 한다.

인터페이스 다중구현

클래스는 분류의 개념이기 때문에 다중상속이 불가능 하다.
인터페이스는 규격 의 개념이기 때문에 여러 규격을 받기 위해 다중구현 이 가능하게 만들어졌다.

인터페이스와 추상클래스의 비교

Interface와 추상메서드는 특정 기능 사용에 대한 규격을 설정 할 수 있다.

익명 ( Anonymous ) 객체

이름이 없는 객체.

인터페이스는 실체가 없고 규격만 존재하기 때문에 객체화가 되지 않는다. ( 클래스에 기생해서 살아야 함 )
이러한 인터페이스를 객체화 하려고 하면 즉석에서 익명 객체가 생성이 된다.

익명객체는 def.block() 와 같이 이용이 가능하다.

익명객체에 def 라는 변수명이 있는데 왜 익명객체일까?
여기서 말하는 '익명' 은 객체의 이름이 아닌 객체의 클래스의 이름이 없음을 의미한다.
즉, 인터페이스 Defence 를 구현한 구현 클래스가 없어 즉석에서 구현 클래스를 { } 에 만들었다는 의미다.

구현 클래스가 따로 없으니 여러 곳에서는 사용이 불가능하다.

인터페이스의 상속

앞서 인터페이스의 다중구현에 대해 알아보았다.
인터페이스는 마찬가지로 상속도 다중으로 가능하다.

여기서 Attack , Defense , Action 은 모두 인터페이스다.

일반적인 클래스의 상속이 다중상속이 안되는 것과는 달리
인터페이스는 다중상속이 가능하다.
클래스의 상속은 위계구조인데 반면 인터페이스의 상속은 모듈 구조이기 때문에 여러 개를 상속이 가능한 것이다.


그리고 이러한 상속받은 Action 인터페이스 를 구현한 Character 클래스Action 인터페이스 만 구현받았지만
Attack , Defense , Action 의 모든 인터페이스 추상메서드를 오버라이드한다.

인터페이스가 상속받는 것도 반드시 인터페이스여야 한다. 즉, 인터페이스끼리 상속이 가능하다는 것이다.
클래스와 인터페이스간은 구현으로 맺어지기 때문에 상속이 안된다.


추상화와 인터페이스의 장점

  • 인터페이스와 추상화는 개발 시 규격 을 만들어 준다.
  • 인터페이스와 추상화를 활용하면 모듈 간의 결합도(coupling) 을 감소시킨다.
  • 규격 이 있다면 서로 다른 것들끼리 충돌 없이 사용할 수 있기 때문이다 ( ex ) 핸드폰 충전기

결합도

결합도가 높으면 A 를 수정하면 A 와 관련된 모든 것을 전체 다 수정해야 한다.
반면 결합도가 낮으면 A 를 수정해도 A 에서 수정이 끝나고 전체 수정할 필요가 없어진다.

  • 결합도가 높은 예시 : 신체 - 떼내면 데미지가 크게 일어난다.
  • 결합도가 낮은 예시 : pc 마우스, 키보드 - 교체해도 데미지 X

etc

button

form 태그 안에 button 태그를 만들면 input type="submit" 과 동일한 효과가 난다.
이때, button 태그type="button" 을 넣으면 일반 버튼이 된다. 그래서 submit 을 해주기 위해 따로 클릭시 전송해주는 go() 함수를 넣어야 한다.

0개의 댓글