H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • 상속 관계에서 메소드 설정
  • 데모 1 : 메소드 재정의가 필요한 이유
  • 데모 2 : 메소드를 재정의한 경
  • 데모 3 : 메소드 재정의 금지
  • 데모 4 : 메소드 재정의 강제
  1. Base Language
  2. Java
  3. Java 중급
  4. 상속

멤버 메소드 설정

상속 관계에서 메소드 설정

상위 클래스에서 멤버 메소드를 만들 때 가장 중요하게 생각해야 하는 부분은 재정의 여부이다. 재정의가 무엇인지 예제를 통해 알아본다.

데모 1 : 메소드 재정의가 필요한 이유

휴대폰 관리 앱을 개발중인 프로젝트 팀에서 개발 생산성 향상을 위해 상속 구조로 클래스를 구현하기로 하였고, 이를 위해 최상위 클래스인 전화기(Phone)를 다음과 같이 설계했다고 가정해보자.

Phone.java
public class Phone {
    protected String number;
    
    public void call() { /* 화 코드 */ }
    public void sms() { /* 메세지 코드 */ }
}

전화기(Phone)은 기본적으로 다음 두 가지 기능이 작동해야 한다.

  • 통화(call) 기능

  • 메세지(sms) 기능

하지만 상세 클래스(Galaxy20s , IPhone12)를 구현하기 전까지는 해당하는 기능이 필요하다는 사실은 알지만 구체적으로 어떻게 작동하는지 설명할 수 있는 방법이 없다. 즉, 해당하는 기능의 명세만 필요한 상황이라고 볼 수 있다. 따라서 내용은 작성할 수 없고, 작성하더라도 매우 추상적인 내용이 작성되어야 한다.

Phone.java
public class Phone {
    protected String number;
    
    public void call() { 
        System.out.println("통화 기능 실행");
    }
    public void sms() {
        System.out.println("메세지 발송 기능 실행");
    }
}

그렇다면 하위 클래스들을 만들 때 Phone 클래스의 call과 sms 메소드를 그대로 이용해야 할까?

Galaxy20s.java
public class Galaxy20s extends Phone{
    
}
IPhone12.java
public class IPhone12 extends Phone {
    
}
InheritExample04.java
public class InheritExample04 {
    public static void main(String[] args){
        Galaxy20s galaxy = new Galaxy20s();
        galaxy.call();
        galaxy.sms();
        
        IPhone12 iphone = new IPhone12();
        iphone.call();
        iphone.sms();
    }
}

단순하게 위와 같이 상속을 받았다고 가정해보면, Galaxy20s와 IPhone12 클래스 모두 call, sms 기능을 가지고 있지만 아무런 차이점도 가질 수 없다. 상속을 통해 중복되는 내용을 없에긴 했지만 정작 차이점을 가질 수 없다는 것이다. 그렇다고 다른 이름으로 구현할 수도 없는 상황인데, 이를 해결하기 위해서는 저장 형태를 이해할 필요가 있다.

위의 그림대로라면 galaxy와 iphone에서 call 메소드를 부르면 각자 자신이 상속받은 Phone 클래스의 call 메소드를 호출하게 된다. 따라서 galaxy와 iphone에서 call 메소드를 부르면 차이점을 가질 수 없게 되는데, 이를 해결하는 방법은 동일한 이름으로 메소드를 this에 하나 더 만드는 것이다.

데모 2 : 메소드를 재정의한 경

Galaxy20s.java
public class Galaxy20s extends Phone{
    public void call(){
        System.out.println("갤럭시20s 통화 기능 실행");
    }
    public void sms(){
        System.out.println("갤럭시20s 메세지 발 기능 실행");
    }
}
IPhone12.java
public class IPhone12 extends Phone {
    public void call(){
        System.out.println("아이폰12 통화 기능 실행");
    }
    public void sms(){
        System.out.println("아이폰12 메세지 발 기능 실행");
    }
}
InheritExample05.java
public class InheritExample05 {
    public static void main(String[] args){
        Galaxy20s galaxy = new Galaxy20s();
        galaxy.call();
        galaxy.sms();
        
        IPhone12 iphone = new IPhone12();
        iphone.call();
        iphone.sms();
    }
}

위 예제에서 Phone 클래스는 동일하게 사용하였다. 실행해보면 결과가 데모1 과 다른 것을 확인할 수 있으며, 그림으로 구조를 살펴보면 다음과 같다.

모든 객체는 자신(this)이 가진 구성요소부터 찾도록 되어 있고, 찾으면 더이상의 탐색을 수행하지 않기 때문에 Phone 클래스의 call과 sms는 더이상 실행되지 않고 Galaxy20s와 IPhone12 클래스의 call과 sms 메소드가 실행되는 것을 확인할 수 있다. 마치 Phone의 call, sms 메소드가 수정된 듯한 느낌을 받게 되며, 이를 메소드 재정의(Method Override)라 부른다.

데모 3 : 메소드 재정의 금지

메소드 재정의를 원치 않는 경우 final 키워드를 사용하여 재정의를 금지할 수 있다.

데모 4 : 메소드 재정의 강제

메소드 재정의를 반드시 수행해야 하는 경우가 있다. 추상 클래스에 대해서 먼저 살펴봐야 한다.

Previous멤버 변수 설정Next생성자 설정

Last updated 3 years ago

불변(final)
추상 클래스
InheritExample04 메모리 예상도
InheritExample05 메모리 예상도
모든 객체는 자신(this)이 가진 구성요소를 먼저 찾는다. 색칠한 부분이 해당 영역이다.