728x90

 

우리의 관심사

어떻게하면 자식 클래스가 부모 클래스가 가지고 있지 않은 새로운 기능을 추가할 것인가?

또 부모 클래스가 가지고 있는 기능을 덮어쓰기(수정) 할 것인가?

 

기능 추가

오리지널 Cal의 sum기능을 복사해서 Cal3에 넣고 minus로 변경

Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재

 class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
}

Cal33 c3 = new Cal33();
System.out.println(c3.sum(2,1));
System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능

오리지널의 기능 수정 가능?

가능

오리지널의 sum에 프린트기능 추가 수정해서 cal3에서 써보자

class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;    // 부모가 가진 기능을 재정의(수정)
	}
}

오버라이딩(Overriding)

부모가 가진 기능재정의하는 것을 오버라이딩(Overriding)

 

 

전체코드

// Java 상속 - 2. 기능의 개선과 발전

class Cal11 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal33 extends Cal11{		// extends : Cal1을 상속
	public int minus(int v1, int v2) {
		return v1-v2;			// Cal3는 이제 부모 클래스가 없는 마이너스 기능도 탑재
	}
	public int sum(int v1, int v2) {
		System.out.println("Cal3!!");
		return v1+v2;
	}
}
public class Inheritance02 {

	public static void main(String[] args) {

		Cal11 c1 = new Cal11();
		System.out.println(c1.sum(2,1));
		
		Cal33 c3 = new Cal33();
		System.out.println(c3.sum(2,1));
		System.out.println(c3.minus(2,1));	// 자식클래스에 추가된 minus기능
		
		
	}
class Cal22 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}

 

728x90
반응형
728x90

 

상속을 배우기 위해 계산기 클래스가 필요

class Cal {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
public class Inheritance01 {

	public static void main(String[] args) {

		Cal c = new Cal();
		System.out.println(c.sum(2,1));		
	}

}

추가로 마이너스 기능을 넣고 싶다면?

일 잘하는 사람은 sum()메소드를 복사해서 새 클래스를 생성

class Cal1 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal2 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
public class Inheritance01 {

	public static void main(String[] args) {

		Cal1 c = new Cal1();
		System.out.println(c.sum(2,1));
		
		
		
	}

}

오리지널인 클래스 Cal1의 버그나 업데이트 했다고하면 오리지널과 같은 기능을 가지고 있는 Cal2 및 다른 여러 클래스들은 똑같이 반영이 안되기 때문에 일일히 수많은 코드를 수정해야한다

또한 같은 내용의 코드도 굉장히 많아질 것

코드가 1억줄이라면 각기 다른 클래스의 같은 내용의 메소드를 쉽게 알아보기가 매우 어려울 것

 -이때 우리가 유용하게 쓸 수 있는 것이 상속(Inheritance)

 

상속(Inheritance)이란?

어떤 클래스가 가지고 있는 변수메소드확장해서 상속해서 다른 클래스갖도록 하는 것

 

상속의 장점

  1. 코드의 재사용성up
  2. 유지보수 편의성 up
  3. 가독성 up
  4. 코드의 양 down

 

 

부모클래스(=superClass)

자식클래스(=subClass)

 

 

전체코드

// Java 상속 - 1. 수업소개 : 상속의 정의 & 장점

class Cal1 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
}
class Cal3 extends Cal1{		// extends : Cal1을 상속
	
}
public class Inheritance01 {
	public static void main(String[] args) {

		Cal1 c1 = new Cal1();
		System.out.println(c1.sum(2,1));
		
		Cal3 c3 = new Cal3();
		System.out.println(c3.sum(2,1));
		
		
	}
class Cal2 {
	public int sum(int v1, int v2) {
		return v1+v2;
	}
	public int minus(int v1, int v2) {
		return v1-v2;
	}
}
}
728x90
반응형
728x90

 

dd자바에서 상속 구현은 자식 클래스가 부모 클래스를 참조하여 인스턴스를 통해 구현되기에

상속할려면 인스턴스 사용도 필수

 

return값을 모니터 출력할려면 print()메소드 사용 잊지말고, 시스템 내에서는 잘 return 되고 있는 것도 다시 remind

 

상속 extends 명령어 & 오버라이딩 개념 이해 및 적용 완료

 

 

 

728x90
반응형
728x90

<클래스와 인스턴스 & 객체지향 이후 공부할 것>

  1. 상속(inheritance)
  2. 인터페이스(Interface)
  3. 패키지(package)

 

1.상속inheritance

class Parent{
		public void method1() {
			// ...
		}
}

Q.위에서 저 클래스를 직접 수정할 수 없거나 변경하지 말아야하는 상황에서 method2()를 추가하고 싶다면?

A.저 클래스 전체를 카피해서 이름 다른 클래스로 해서 method2()를 추가

이 방법은 class parent의 method1의 코드 개선, 버그 해결 등을 하게 되면 이 method1을 카피한 수많은 모든 코드를 다 수정해야함. 일 산더미...?

 

이 문제 개선을 위해 자바에서 제공하는 기능이 상속

extends를 붙여서 상속표시

class Child extends Parent{
		public void method2() {
				// ... 
		}
}

Child라는 클래스에는 실제로는 method1이 구현되어 있지 않지만, 상속 받았기에 class Parent에 있기에 class Child에서도 사용 가능해짐

 - class parent 코드가 수정되면, 동시에 다른 자식 클래스에도 다 같이 수정된다

 

 

2.인터페이스(Interface)

interface contract {
		public String method1(String param);
		public int method2(int param);
}

원래 인터페이스에는 메소드의 이름, 파라미터와 리턴값의 형식은 적으나 실제 내용은 적지 않는다

 

class Concreate1 implements Contract {

}

위 코드 의미

Concreate1 이라는 클래스Contract 라는 인터페이스에 적혀있는 메소드들의 형식을 구현했다 or 구현해야한다는 의미

이 상태로 Concreate1 클래스를 컴파일하면 컴파일조차 안된다

 - 규칙위반 때문

 - Contract에 적혀 있는 메소드들을 정의해야한다는 규칙을 어겼기 때문

 

implements에 contract를 적어놓게 되면 class Concreate1은 interface의 contract적혀있는 형태의 메소드구체적으로 구현해야하는 책임을 갖는다

class Concreate1 implements Contract{
		public String method1(String param) {
				return "foo";
		}
		public int method2(int param) {
				return 1;
		}
}
// 클래스 콘크리트1 안에 내용이 메소드1의 내용으로 채워짐

 

 

마찬가지로 class Concreate2

Concreate1Concreate2서로 다른 클래스이지만 확신할 수 있는 것은,

이 클래스들은 반드시 contract에 약속되어 있는 정의되어있는 형태의 멤버들을 구현하고 있을 것이라는 것. 일종의 무언의 약속

 

3.패키지(package)

클래스 이름은 같지만 기능이 다른 두 클래스가 존재할 수 있다

ex)서로 다른 디렉토리에 있는 경우, 한 컴퓨터 안에 같은 이름의 파일이 여러개 존재할 수 있는 것

 

클래스도 서로 다른 패키지에 묶여있으면 같은 이름의 클래스가 공존 가능

많아진 클래스정리정돈의 도구로써 사용되는 것이 패키지

패키지보다 더 큰 정리정돈의 도구는 자바에서는 없다

 

 

 

 

 

728x90
반응형
728x90

 

JAVA1 - 13.5. 자바 문서 보는 법 - 상속(inheritance)

 

JAVA API 문서

PrintWriter클래스를 만든 사람은 처음부터 만들고 싶지 않아서 Writer클래스에서 상속받아 PrintWriter클래스를 만들었고 Writer클래스를 만든 사람은 마찬가지로 Object클래스를 상속받아 쉽게 Writer클래스를 만든

 

*자바에서는 변수 필드라고 함 (Field = variable)

 

 

이클립스에서 상속관계(hierarchy) 보는 방법

[보기 원하는 클래스 위에 우클릭] - [Open tpye Hierarchy 클릭(F4) ]

 

Object 아래 toString 있고 Writer 있음

Object 아래 상속 Writer 아래 상속 PrintWriter 상속

PrintWriter클래스 쓰면 같은 부모 Object 아래 상속 되었기에, Object 아래있는 다른 클래스인 toString 같이 사용가능

 

 

 

자바의 모든 클래스는 Object클래스를 반드시 상속받음

누군가가 Writer라고 하는 어떤 취지를 가진 클래스를 만드는데 필수이기도 하고

Object기능을 사용하기도해서 Object 상속 받는데 이때 사용하는 키워드가 extends

 

 

, Object 확장(extends)해서 Writer 클래스를 만들었다는

마찬가지로, PrintWriter클래스도 Writer 클래스를 확장(extends)해서 만든

 

 

PrintWriter p1 = new PrintWriter("result 1");
p1.toString()

PrintWriter 인스턴스(P1) 만들고 인스턴스에 .toString()이라고 하게되면

상태에서 toString() 오브젝트에 있다고 하면, 자바가 어떻게 동작하는가?

 - PrintWriter클래스에 toString 있는지 보고 없으면 extends 가리키는 Writer 찾아보고 없으면 extends 가리키는 Object 찾아본다. 없으면 에러가 나고 있으면, toString() 메소드를 실행

 


 

Writer클래스는 String 받는 write클래스( write(String) : void  ) 정의되어 있다

PrintWriter클래스에서도 String 받는 write클래스( write(String) : void  ) 정의되어 있다

 - , Writer클래스에도 write메소드가 있는데 Writer클래스를 상속 받는 PrintWriter클래스에도 write메소드가 있는 . 다시말해, 덮어쓰기(overriding)

 

위의 상태에서 write()메소드는 누구의 write 메소드일까?

 - PrintWriter클래스 write(String) : void 사용하는

 

 

덮어쓰기(Override)?

PrintWriter클래스를 만든 사람이 Writer클래스의 write()메소드가 마음에 들지 않거나 취지에 맞지 않는다면 부모클래스의 메소드를 사용하지않고 자식클래스(자신) write()메소드를 사용하는데, 이를 덮어쓰기(overriding) 한다고한다

 


 

<JAVA API 보는법>

Tree

클래스 상속관계(Hierarchy) 있는

 

자바가 기본적으로 제공하는 표준 라이브러리들이 서로 간에 어떤 상속관계를 가지고 있는지 보여준다.

정점에는 역시 Object. 페이지 상단에 위치

 

 

자바에서 변수를 필드라 부름

필드=변수

위의 Fields Summary 의미

위의 lock이라고 하는 변수(필드) Writer()클래스에 정의되어있고 상속받아서 PrintWriter() lock이라는 필드(변수) 사용할 있다는 의미

 

Object클래스로부터 상속받았기 때문에 위의 메소드들은 사용할 있다는 의미

 

 

 

728x90
반응형
728x90

017. 객체지향 언어란 - 특징 -

 

 

출처 : 위키백과

 

기본 구성요소에 대해 알아봤다면, 각각의 특징에 대해서 알아보자

 

1.자료의 추상화


불필요한 정보는 숨기고 중요한 정보만 표현하여 프로그램을 간결화 하는 것

 

 - 자료 추상화를 통해 정의된 자료형을 추상 자료형이라 함

 - 객체지향 프로그래밍(OOP)에서 일반적으로,

     추상 자료형을 클래스

     추상 자료형의 인스턴스를 객체

     추상 자료형에서 정의된 연산을 메소드

             라고한다. 

 

2.상속

새로운 클래스가 기존 클래스의 데이터와 연산을 이어 받아 사용할 수 있게 하는 기능

상속받는 새 클래스를 부클래스, 파생 클래스, 하위클래스, 자식 클래스 등으로 부르며, 기존 클래스를 기반클래스, 상위 클래스, 부모 클래스 등으로 부른다. 

상속개념을 통해 상위 클래스에서 이어받은 하위 클래스를 이용해 필요에 따라 클래스 수정이나 클래스 간 종속 관계를 형성해 객체를 조직화 할 수 있다

 

 

3.다중 상속

클래스가 2개 이상의 클래스로부터 상속 받을 수 있는 기능

 클래스들의 기능이 동시에 필요할 때 사용하나 상속관계에 혼란을 줄 수 있으니 주의가 필요하고 언어마다 가능유무가 다르니 확인이 필요하다

 

4.다형성 개념

어떤 한 요소에 여러 개념을 넣어 놓는 것

 보통 오버라이딩이나 오버로딩을 의미한다

 - 오버라이딩 : 같은 이름의 메소드가 여러 클래스에서 다른 기능을 하는 것

 - 오버로딩 : 같은 이름의 메소드가 인자의 개수나 자료형에 따라서 다른 기능을 하는 것

 

5.동적 바인딩

실행 시간 중에 일어나거나 실행과정에서 변경될 수 있는 바인딩

바인딩 : 프로그램의 기본 단위에 해당 기본 단위가 가질 수 있는 속성 중에서 일부 필요한 속성만을 선택하여 연결해 주는 것

 ex) 변수를 구성하는 식별자(이름), 자료형 속성, 하나 이상의 주소(참조), 자료값에 구체적인 값을 확정하는 것

 

컴파일 시간에 완료되어 변하지 않는 정적 바인딩과는 반대 개념이다

 

 

728x90
반응형

+ Recent posts