1. 상속(inheritance)

  • 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법 요소이다
  • 두 클래스를 상위 클래스와 하위 클래스로 나누어 상위 클래스의 멤버(필드, 메서드, 이너 클래스)를 하위 클래스와 공유하는 것을 의미한다
  • 여기서 우리는 이 두 클래스를 서로 상속 관계 있다고 하며, 하위 클래스는 상위 클래스가 가진 모든 멤버를 상속받게 됩니다.
  • 하위 클래스의 멤버 개수는 상위 클래스의 멤버 개수보다 같거나 많아야 한다
  • 상위 클래스-하위 클래스의 관계를 조상-자손 관계로 표현하기도 한다
  • 두 클래스 간 상속 관계를 설정할 때 사용하는 extends 키워드는 "확장하다"라는 의미를 가지고 있다

  • 상위 클래스와 하위 클래스의 공통점과 다른점이 있다
    - 상위 클래스의 변수와 메서드를 하위 클래스에 그대로 받아와서 사용한다
    - 하위 클래스는 필요한 변수와 메서드를 추가하여 코드를 작성할 수 있다 
  • 상속을 통해 클래스를 작성하면 코드를 재사용하여 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있어 코드의 중복을 제거할 수 있다
  • 상속은 다형적 표현이 가능하다는 장점이 있다
  • 하위 객체의 클래스에 상위 객체에서 확장된 클래스의 성격도 가지고 있는 것을 다형성이라 한다
  • 위의 그림을 코드로 작성하면 아래와 같다
    - extends 를 확장 메서드로 사용한다
class Person{
    String name;
    int age;
    void learn(){
        System.out.println("study");
    }
    void walk(){
        System.out.println("walking");
    }
    void eat(){
        System.out.println("eating");
    }
}
class Teacher extends Person{
    String schoolName;
    void teach(){
        System.out.println("teaching");
    }
}
class Ceo extends Person{
    String companyName;
    void approval(){
        System.out.println("review");
    }
}
class Developer extends Person{
    String groupName;
    void coding(){
        System.out.println("coding");
    }
}
public class Extends {
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "kms";
        p.age = 25;
        p.learn();
        p.walk();
        p.eat();
        System.out.println(p.name);

        Teacher t = new Teacher();
        t.name = "kim";
        t.age = 30;
        t.learn();
        t.walk();
        t.eat();
        t.teach();
        System.out.println(t.name);
    }
}
  • 코드의 결과는 다음과 같이 출력된다
    - Teach 클래스가 person 클래스의 변수와 메서드를 상속받아서 확장된 것을 확인할 수 있다
    - extends 메서드로 상위 클래스를 확장하지 않았다면 중복된 변수와 메서드를 반복해서 작성해야 했을 것이다

 

 

2. 포함(composit)

  • 포함(composite)은 상속처럼 클래스를 재사용할 수 있는 방법이다
  • 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언한다
  • 클래스명(멤버1, 멤버2, 멤버3,...) 의 형태로 사용한다
    - 외부 클래스 내에 내부 클래스를 작성한다
    - 내부 클래스에 main 클래스가 있다
    - Address 객체를 외부 클래스 밖에서 별도의 클래스로 선언 한다
public class Composit {
    int id;
    String name;
    Address address;

    public Composit(int id, String name, Address address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    void showInfo() {
        System.out.println(id + " " + name);
        System.out.println(address.city + " " + address.country);
    }


    public static void main(String[] args) {
        Address address1 = new Address("Gangnamgu", "Seoul");
        Address address2 = new Address("Junggu", "Seoul");

        Composit e = new Composit(1, "kms", address1);
        Composit e2 = new Composit(2, "kim", address2);

        e.showInfo();
        e2.showInfo();
    }
}
class Address {
    String city, country;

    public Address(String city, String country) {
        this.city = city;
        this.country = country;
    }
}
  • Address 클래스에 포함되어 있는 인스턴스 변수 city와 country를 각각 Composit 클래스의 변수로 정의해주어야 하지만, Address 클래스로 해당 변수들을 묶어준 후 Composit 클래스 안에 참조변수를 선언하였다
    - 코드의 중복을 없애고 포함관계로 재사용하는 방법이다

 

 

3. 상속과 포함의 선택

  • 클래스 간의 관계가 ‘~은 ~이다(IS-A)’ 의 관계이면 상속을 사용한다
  • 클래스 간의 관계가 '~은 ~을 가지고 있다(HAS-A)'의 관계이면 포함을 사용한다

 

4. 메서드 오버라이딩(Method Overriding)

  • 상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는 것을 의미한다
  • Override는 사전적으로 "~위에 덮어쓰다"를 의미한다

 1) 일반적인 메서드오버라이딩

class Airplane{
    void fly(){
        System.out.println("Airplane is flying");
    }
}

public class MethodOverriding extends Airplane {
    void fly(){
        System.out.println("MethodOverriding is flying");
    }

    public static void main(String[] args) {
        MethodOverriding over = new MethodOverriding();
        over.fly();
    }
}

  • MethodOverriding 클래스가 Airplane 클래스의 fly 메서드를 오버라이딩 한 후 MethodOverriding 클래스에 적합하게 fly 메서드를 변경하고 있다
  • 메서드 오버라이딩은 세가지 조건을 반드시 만족해야 한다
    - 메서드의 선언부(메서드 이름, 매개변수, 반환타입)가 상위클래스와 완전히 일치해야 한다
    - 접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다
    - 예외는 상위 클래스의 메서드보다 많이 선언할 수 없다

 2) 상위 클래스의 타입을 적용한 메서드 오버라이딩

public class Overriding {
    public static void main(String[] args) {
        Bike bike = new Bike();
        Car car = new Car();
        Human human = new Human();

        bike.run();
        car.run();
        human.run();

//상위 클래스 Vehicle 타입을 사용하여 각각의 객체의 메서드 값을 다르게 출력한다
        Vehicle bike2 = new Bike();
        Vehicle car2 = new Car();
        Vehicle human2 = new Human();

        bike2.run();
        car2.run();
        human2.run();
    }
}
class Vehicle{
    void run(){
        System.out.println("Vehicle is running");
    }
}
class Bike extends Vehicle{
    void run(){
        System.out.println("Bike is running");
    }
}
class Car extends Vehicle{
    void run(){
        System.out.println("Car is running");
    }
}
class Human extends Vehicle{
    void run(){
        System.out.println("Human is running");
    }
}

 

 3) 배열을 적용한 메서드 오버라이딩

 Vehicle[] vehicles = new Vehicle[]{new Bike(), new Car(), new Human()};
        for (Vehicle vehicle : vehicles) {
            vehicle.run();
        }

??? 이해가 잘 안간다...추가로 찾아보자.

 

5. super

 1) super

  • 자신보다 상위의 클래스에 있는 객체를 의미한다
  • 반드시 함수의 첫 줄에 위치하여야 한다

ex1) Parents의 변수 count와 Kim의 변수 count가 동일한 상황에서의 Kim 과 Parents의 나이를 출력

class Kim Parents       
variable age count count    
constructor Kim()        

- #19 에서 굳이 this 키워드를 사용하지 않아도 출력은 동일하다. 설명을 위하여 구분하기 위해 사용하였다

- 여기서 super 과 this() 의 차이점은 각각 상위클래스의 객체와 생성자를 의미한다는 부분이다

- 상속관계를 전제로 하며, super.변수명 의 형식으로 사용한다

※ 상속관계가 아닐 경우 에러(count 변수를 찾을 수 없다)가 발생한다

 

 2) super()

  • super은 객체를 의미하지만, super()는 생성자를 의미한다
  • 반드시 함수의 첫 줄에 위치하여야 한다

ex1) Parentsname의 변수 count와 Kimname의 변수 count가 동일한 상황에서의 Kimname 과 Parentsname의 나이를 출력하고, Parentsname를 상속받아 모두 출력

class Kimname Parentsname       
variable name count      
constructor Kimname Parentsname      

 

6. Object 클래스

  • 자바 클래스 상속계층도 중 최상위에 위치한 상위클래스이다
  • 자바의 모든 클래스는 Object클래스를 기본적으로 상속되면, Object클래스로부터 확장된다
  • 상속클래스가 없는 경우 자동으로 extends object를 추가하여 Object클래스가 상속된다
class Parent //컴파일러가 "extends Object" 자동 추가 { 
}
class Child extends Parent {
}

※ 기본 Object 메서드 

메서드명  반환 타입 주요 내용
toString() String 객체 정보를 문자열로 출력
equals(Object obj) boolean 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교
hashCode() int 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단
wait() void 현재 쓰레드 일시정지
notify() void 일시정지 중인 쓰레드 재동작
 

 

 

▶ 상속 (프로그래밍) : http://wiki.hash.kr/index.php/%EC%83%81%EC%86%8D_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D) 

 

상속 (프로그래밍) - 해시넷

상속(相續, inheritance)은 객체 지향 프로그래밍(OOP)에서 자손 클래스가 조상 클래스의 기능을 그대로 이어받아서 재사용하는 것을 말한다. 자바에서는 계승, 확장이라는 단어로 사용된다.[1] 객체

wiki.hash.kr

  상속 (객체 지향 프로그래밍) : https://ko.wikipedia.org/wiki/%EC%83%81%EC%86%8D_(%EA%B0%9D%EC%B2%B4_%EC%A7%80%ED%96%A5_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D)

 

상속 (객체 지향 프로그래밍) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래스는 기반 클래스, 수

ko.wikipedia.org

  상속의 개념 : http://www.tcpschool.com/java/java_inheritance_concept 

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

   Java inheritance : https://www.youtube.com/watch?v=Zs342ePFvRI 

 

1. 클래스

  • 클래스는 객체를 정의한다
  • 클래스는 객체를 생성하는데 사용한다
  • 클래스는 객체를 만들기 위한 설계도라고 할 수 있다

 1) 클래스 구성

  • 필드(field) : 클래스의 속성을 나타내는 변수이다
  • 메서드(method) : 클래스의 기능을 나타내는 함수이다
  • 생성자(constructor) : 클래스의 객체를 생성하는 역활을 한다
  • 이너클래스(inner class) : 클래스 내부의 클래스를 의미한다
  • 위의 4가지 요소로 구성된다
  • 필드, 메서드, 이너클래스를 통틀어 멤버(member)라고 한다
더보기

■ 자동차를 예로 필드의 속성과 메서드의 기능을 알아보자

속성 { 모델, 바퀴의 개수, 도어의 개수, 색상 등... }     ->      class Car {
 //변수 선언을 통해 나타낸다                                                   private String model ;
                                                                                                 private int wheels;
                                                                                                 private int doors;
                                                                                                 private String color;

기능 { 시동, 가속, 정지, 와이퍼 작동 등...}                 ->          void power( ) {....};
//함수를 통해 나타낸다                                                            void accelerate( ) {....};
                                                                                                void stop( ) {....};
                                                                                                void wipers( ) {....};
                                                                                           }   

public class Example {                //Example class 선언
	int a = 10;                       //필드
	if a(){ };                        //메서드 
    void printX() {...}               //메서드
	Example exe = new Exanple()       //생성자
	class Example2 {...}              //이너 클래스
}

 2) 클래스 추가 정의

  • 클래스 == 데이터 + 함수 의 결합으로 사용할 수 있다
    - 클래스 : 데이터와 함수의 결합 (구조체 + 함수)
    - 데이터는 변수와 같다
    - 함수는 메서드와 같으며, 명령문의 집합체이다
    - 함수의 작업은 데이터를 재료로 계산을 한다
    - 데이터와 함수는 상호 관련성이 있으므로 결합하여 사용하는 것이 용이하다

  • 데이터 저장의 변화는 다음과 같다
    - 변    수 : 하나의 데이터를 저장할 수 있는 공간
    - 배    열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
    - 구조체 : 서로 다른 종류의 데이터라도 관련성이 있다면 하나로 저장할 수 있는 공간
    - 클래스 : 데이터와 함수의 결합 (구조체 + 함수)

 

  • 클래스는 사용자 정의 타입이다
    - 원하는 타입을 사용자가 직접 만들 수 있다

    ex) 사용자 정의 변수를 통하여 코그의 단순화한 경우

 

2. 객체

  • 실제로 존재하는 사물이나 개념, 논리 등을 말한다
  • 객체가 가지는 기능과 속성에 따라 사용되는 용도가 다르다
  • 실제 존재물 HW을 컴퓨터가 실행할 수 있는 SW 로 만들는 과정에서 사용된다
  • 모든 인스턴스를 대표하는 일반적 용어이다
  • 클래스를 객체로 생성하기 위해서 메모리로 할당하는 과정을 인스턴스화 한다고 말한다

 1) 구성요소

  • 객체 = 속성(변수) + 기능(메서드) 로 구성된다
  • 객체를 사용하기 위해서는 속성과 기능을 부여해 줘야 한다
  • HW를 분석하여 SW화 하는 방법이다

 2) 객체의 생성

  1. 클래스명 ; //클래스를 선언한다
  2. 클래스명 변수명 ; //클래스의 객체를 참조하기 위한 변수(참조변수)를 선언한다
  3. 변수명 = new 클래스명( ) ; //클래스 인스턴스를 생성하여 참조변수에 주소를 저장한다. 메모리에 참조변수 영역을 확보한 객체가 생성된다
  4. 2와 3은 다음과 같이 줄여서 사용할 수 있다 -> Audio audio = new Audio( );

    ex) 1 class Audio;                             class Audio;  

          2 Audio audio;                 ->        Audio audio = new Audio( );

          3 audio = new Audio( );

 

 3) 객체의 사용

  • 클래스 작성 -> 객체 생성 -> 객체 사용 의 순서로 작성한다
    - 클래스는 객체를 만들기 위한 설계도 역활이며, 객체는 객체를 사용하기 위하여 생성된다.
  • 객체의 사용은 변수와 메서드를 사용한다는 의미이다
  • 객체 사용 시에는 참조변수를 필히 호출하여 사용한다
    - 참조변수.멤버변수 = 값 ; //참조변수 객체의 멤버변수에 값을 저장하는 경우에 사용한다
      ex) audio.volume = 50 ; //오디오 객체의 볼륨변수의 값을 50으로 저장한다 

    - 참조변수.메서드변수( ) ; -> 참조변수 객체의 메서드변수를 호출하여 실행하는 경우에 사용한다
      ex) audio.volumeup( ) ; //오디오 객체의 볼륨변수에 있는 기능을 실행시킨다 (volume++)
  • 변수가 생성되면 기본값으로 초기화된다

ex1) 

 

ex2)

ex3)

class Audio {
   public static void main(String arg[]){
       Audio audio = new Audio( );
       audio.model;//변수 사용
       audio.power = power; //전원 true
       audio.volume = 50; //현재 볼륨 입력
       audio.volumeup( ); //메서드 사용, 볼륨 +1 상승 = 50+1 = 51
       System.out.println("현재의 볼륨은" + audio.volume + "입니다");
	}
}
class audio {
	String model;
    Int volume;
    boolean power = power;
    
    audio.model( ) {“white”;}
    audio.power( ) {power = !power;}
    audio.volumeup( ) {volume++;}
    audio.volumedown( ) {volume--;}
}

result
"현재의 볼륨은 51입니다

 

 

import java.util.Scanner;  //Scanner 유틸 호출

//간이계산기 프로그램 
public class Calculator {
    public static void main(String[] args) { //maun 메서드 선언
        Scanner scan = new Scanner(System.in); //Scanner 객체 생성 : 외부입력

        System.out.println("첫 번째 숫자를 입력하세요."); //콘솔출력
        String no1 = scan.nextLine(); //첫 번째 숫자 입력
        
        System.out.println("사칙연산자를 입력하세요.");
        String op = scan.nextLine(); //사칙연산자 입력

        System.out.println("두 번째 숫자를 입력하세요.");
        String no2 = scan.nextLine(); //두 번째 숫자 입력

        int num1 = Integer.parseInt(no1); //입력받은 첫 번째 문자를 숫자형으로 변환
        int num2 = Integer.parseInt(no2); //입력받은 두 번째 문자를 숫자형으로 변환
        int result;

        if(op.equals("+")) {              //덧셈 연산
            result = num1 + num2;
        }
        else if(op.equals("-")) {         //뺄셈 연산
            result = num1 - num2;
        }
        else if(op.equals("/")) {         //나누기 연산
            result = num1 / num2;
        }
        else{
            result = num1 * num2;         //곱하기 연산
        }

        System.out.println(no1 + " " + op + " " + no2 + " = " + result); // 결과값 출력
    }
}

 

3. 소스파일과 클래스의 관계

  • 하나의 소스 파일에는 하나의 public class만 존재해야 한다
  • 또한, 하나의 소스 파일에는 하나의 클래스만 존재하는 것을 권장한다
  • 소스파일의 이름은 main 메서드가 있는 클래스의 이름과 일치해야 한다
  • 하나의 소스 파일에 여러 개의 클래스가 존재할 경우 소스파일의 이름은 아래와 같이 사용한다
소스파일 클래스 내용
Hello1.java public class Hello1 { }
           class Hello2 { }
public class가 있는 경우
소스파일의 이름은 반드시 public class 이름과 일치해야 한다
class Hello1 { }
class Hello2 { }
public class가 없는 경우
소스파일의 이름은 Hello1, Hello2 어떤 것을 사용해도 상관없다
  • 아래와 같은 경우는 오류가 발생한다
소스파일 클래스 내용
Hello1.java public class Hello1 { }
public class Hello2 { }
하나의 소스파일에 두 개 이상의 public class가 존재할 수 없다
각 클래스를 별도의 소스파일로 나눠서 저장하거나 class 중 한 개의 public를 삭제해야 한다
Hello2.java public class Hello1 { }
          class Hello2 { }
소스파일의 이름과 public class의 이름이 일치하지 않는다
소스파일의 이름을 Hello1.java로 변경해야 한다
hello1.java public class Hello1 { }
          class Hello2 { }
소스파일의 이름과 public class의 이름이 일치하지 않는다
소스파일의 이름은 대소문자도 일치해야 한다
소스파일의 이름을 대문자 H로 변경해야 한다

 

 

 참조 링크

해시넷 객체 : http://wiki.hash.kr/index.php/%EA%B0%9D%EC%B2%B4

 

객체 - 해시넷

객체(客體) 또는 오브젝트(object)란 객체 지향 프로그래밍(OOP)에서 클래스(class)가 실제로 구현된 인스턴스(instance)를 말한다. 즉, 객체란 클래스를 인스턴스화한 것이다. 절차적 프로그래밍과 달

wiki.hash.kr

위키피아 객체 : https://en.wikipedia.org/wiki/Object_(computer_science) 

 

Object (computer science) - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Arbitrarily defined dataset with specified properties used in some programming paradigms In computer science, an object can be a variable, a data structure, a function, or a method. As

en.wikipedia.org

▶  Classes & Objects | Java | Tutorial 26 : https://www.youtube.com/watch?v=Mm06BuD3PlY

 

 

+ Recent posts