본문 바로가기

Java 기본 개념

자바를 잡아라 제 10장 - 물려받는 게 없다면 스스로 만들어라

728x90

 

 

 

패키지 (package) 
: 서류도 파일철 해야 편하게 볼 수 있는 법 : )

 

 

   개발자가 직접 만들어 사용하는 사용자 정의 클래스와

   JDK(Java Development Kit)안에 포함되어 있거나 다른 개발자들이 미리 만들어 놓은 클래스

   클래스들은 매우 종류가 많고 비슷한 기능들을 분류시켜야 할 필요성 이 있기 때문에

   서로 관계가 있는 클래스들을 패키지로 묶어서 관리한다


   현재 클래스에서 다른 패키지의 외부 클래스를 사용하고 싶은 경우에 import 키워드로 

   해당 클래스의 전체 경로 패키지명까지 포함해 지정해줘야 한다
   ( 해당 패키지 안에 들어있는 모든 클래스를 사용하고 싶다면 * 기호를 넣어주면 된다 )

 

     ex) import java.util.Scanner;
     ex) import java.util.*;

 

 

 

 

   [ package 선언 방법 ]

 

 

 


 1. 사용자가 임의로 패키지를 만드려면 클래스의 가장 윗부분에 패키지 구문을 포함
       ex) package store
 2. 패키지 이름은 영문 소문자로 지정하는 것을 권장
 3. 대분류와 소분류 패키지를 구분할 때는 dot(.)을 사용
 4. 최상위 패키지의 이름은 java 로 시작할 수 없습니다 . java

 

 

 

 

 

 

데이터 타입
: 기본 타입과 참조 타입

 

 

 

 

 

 

[ 참조 타입 String ] 

 

 

    문자열이 동일하다면 String객체를 공유하도록 되어있어서 단순히 문자열을 String 변수에 할당한다면 주소값이 같다


    그렇기 때문에 new 키워드를 사용해서 String 객체를 직접 heap 영역에 생성한다면 문자열의 내용이 같더라도

    다른 주소값을 가지게 되므로 동등 , 비동등 연산자( ==, != ) 의 결과가 false 로 나오게 된다
   
    따라서 동일 문자열의 내용 값 그 자체를 비교해야 한다면 equals ( ) 메서드를 사용해야 한다

 

 


     

 

 

객체지향 프로그래밍 기술
( 상속, 은닉, 다형성 )

 

 

 

    1. 상속 ( Inheritance )

 

        ▶ 기존의 클래스를 확장해 새로운 클래스를 이끌어내는 것

        ▶ 기존의 코드를 재사용함으로써 불필요한 코드를 재작성하는 번거로움 없앨 수 있고 

             새로운 클래스를 만드는 시간과 노력 줄일 수 있음

       

         ▶ 단일상속만을 지원

 

 

 

 

       ▶ 어떤 클래스가 다른 클래스로부터 상속을 받아 만들어지면 새롭게 만들어진 클래스를 자식 child / sub 클래스

           멤버변수와 메서드를 물려준 클래스는 부모 parent / super 클래스 

       ▶ 상속을 하면 부모클래스의 멤버변수와 메서드가 자식클래스에 상속이 된다 

             ( 부모클래스의 생성자는 상속 X )

 

       ▶ 상속을 사용하는 키워드는 extends 

       ▶ 자바의 모든 클래스는 Object 클래스( 최상위 클래스 )를 상속받고 있음 

 

 

 

 

 

  다음의 예제를 살펴보자

 

 

 

각각 Employee, Student, Teacher이라는 객체를 나타내는 클래스

 

 

위의 3개의 클래스들은 멤버변수와 메서드 모두 같은 내용으로 이루어져 있기 때문에

하나의 정형화 된 클래스를 만들어 효율적으로 객체를 생성할 필요가 있다

 

 

위의 3개의 객체 클래스들을 Person이라는 하나의 정형화된 클래스로 정형화

 

 

 

 

 

 메서드 재정의 ( Overriding )
: 덮어쓰기

 

 

메서드 재정의(Overriding)
부모클래스로부터 상속받은 메서드를
자식클래스에서 행위를 바꾸거나
보완하기 위해 다시 정의해서 사용하는 것 말한다


                          부모클래스에서 특별한 용도로 사용하던 메서드를 자식클래스에서 다른 용도로 사용할 때 필요하다

                          부모클래스의 모든 메서드가 자식클래스에 맞게 설계되어 있다면 가장 이상적인 상속이지만,

                          특정 메서드는 자식 클래스가 사용하기에 적합하지 않을 수도 있다

                          그렇기에 때문에 상속된 일부 메서드는 자식클래스에서 재정의하여 사용해야 한다

                          메서드가 자식클래스에서 재정의되었다면 ( =오버라이딩 )

                          자식객체를 통해 메서드를 호출했을 때 새롭게 재정의된 메서드가 호출된다

 

 

 

(왼쪽) 부모 클래스, (오른쪽) 자식 클래스 - 부모 클래스의 메서드를 오버라이딩

 

 

 

 [ 메서드 재정의 규칙 ]

  

                                                                      1. 반드시 상속을 전제로 해야 한다

                                                                      2. 반드시 반환 유형이 같아야 한다

                                                                      3. 메서드 이름이 같아야 한다

                                                                      4. 매개 변수 선언이 정확히 일치해야 한다

                                                                      5. 접근제한자는 같거나 더 제한이 없어야 한다

 

 

 

 

 

 

다음의 두 가지의 예제를 살펴보자 

 

 

 

1. 오버라이딩의 기본편

 

 

부모 클래스인 Parent 클래스와 부모 클래스를 상속 받은 자식 클래스인 Child 클래스

 

main 클래스

 

 

 

       [ Parent 클래스 - 부모 클래스 ]

 

          ① 반환값 없고 매개변수 없는 메서드 method01 선언

          ② 반환값이 int 타입이고 매개변수는 없는 메서드 method02 선언

 

 

        [ Child 클래스 - 자식 클래스]

 

           ① 부모 클래스인 메서드 method02를 오버라이딩

           ② 반환값 없고  매개변수 없는 메서드 method03 선언

 

 

        [ Main 클래스 ]

 

           ① 자식 클래스인 Child를 생성자를 생성

           ② 자식 클래스의 생성자를를 통해 부모 클래스에서 상속 받은 method01을 호출

           ③ 자식 클래스에서 오버라이딩 한 method02을 호출

           ③ 자식 클래스만의 고유한 기능을 가진 메서드 method03  호출

 

 

 

 

 

 

 

2. 오버라이딩의 응용편

 

 

 

부모 클래스인 Person 클래스

 

       [ Person 클래스 - 부모 클래스 ]

                                                   

 ① String 타입의 name과 int 타입의 age 멤버변수 선언

               ② 반환값이 String 타입이고 매개변수는 없는 메서드 info( ) 선언

 

 

 

부모 클래스를 상속 받은 Teacher 클래스

 

부모 클래스를 상속 받은 Employee 클래스와 Student 클래스

 

 

  [ Child 클래스 - 자식 클래스]

 

                                          ① 각 자식 클래스들이 자신의 고유한 기능을 표현하기 위한 멤버변수를 선언

                                           그에 맞게 부모 클래스인 메서드 info( )를 오버라이딩    

                                          

 

 

main 클래스

 

 

 [ Main 클래스 ]

 

                       ① 부모 클래스의 생성자를 만들어 생성하고 각 멤버변수를 초기화하여 메서드 info( ) 호출 후 실행

                       ② 각 자식 클래스의 생성자를 만들어 생성하여 상속 받은 멤버변수와

                            자신의 고유한 멤버변수를 초기화하여 오버라이딩 된 메서드 info( ) 호출 후 실행

     

 

 

 

 

 

 메서드 중복( Overloading )
: 삼계탕 먹는 날을 의미하는 게 아니야!

 

 

 

       자바는 메서드나 생성자의 중복 선언을 허용한다

       중복은 메서드 또는 생성자를 선언할 때 이름은 같지만

       매개 변수의 유형이나 개수를 다르게 선언해 놓는 것을 의미한다

       중복을 사용하면 하나의 메서드로 매개 변수의 유형에 따라 다른 동작이 실행된다 ( 굉장히 효율적! )

 

 

 

 

          [ 메서드 중복 조건 ]

  

            1. 메서드 이름이 같아야 한다

            2. 매개 변수의 유형이 달라야 한다

            3. 매개 변수갯수가 달라야 한다

            4. 매개 변수의 순서가 달라야 한다

            5. 접근제한자반환유형은 영향을 미치지 않는다

 

 

 

 

 

  다음의 예시를 통해 살펴보자  ▼

 

 

오버로딩이 발생한 MyClass와 메인 클래스

 

 

 

                    ① abc라는 이름을 가진 메서드를 매개변수의 갯수, 유형, 순서에 따라 다르게 실행 하기 위해 오버로딩

                    ② MyClass의 생성자를 생성하고 참조연산자를 사용해 abc 메서드 호출

                       

                           ▷ 데이터 타입이 int, String인 메서드 실행   

                            데이터 타입이 double, double인 메서드 실행   

                           데이터 타입이 String인 메서드 실행

                            데이터 타입이 double, double인 메서드 실행 ( int 타입은 double 타입에 포함되기 때문에 가능 )