StringBuffer 클래스

-String 처럼 문자열 배열(char[])을 내부적으로 가지고 있다.

-String과 달리 내용을 변경 할 수 있다. 변경가능

-문자열을 가지고 조작을 많일 할 경우 추가,변경 등 스프링버퍼가 유리

-StringBuffer(”abc”) : character 배열이 만들어진다.

-sb.append(”123”) : 새로운 문자열이 추가된다. 배열에 내용이 추가된다.

-배열은 길이 변경불가. 공간이 부족하면 새로운 배열 생성해야한다

-처음에 길이가 5인 배열을 만들어서 1~5저장후 6을 저장하고 싶다면 ?

-배열의 길이가 불가능

1. 새로운배열 만들기

2. 내용복사

3. 참조변경

-StringBuffer는 저장할 문자열의 길이를 고려해서 적절한 크기로 생성해야한다. (공간이 부족하지않도록..)

-StringBufferString과는 달리 내용 변경이 가능하다.

StringBuffer sb = new StringBuffer(”abc”);

-append() 끝에 문자열 추가

-delete()삭제

-insert()삽입

-반환타입이 StringBuffer이다.

-sb.append(”123”).append(”zz”)가능한 이유가 반환타입이 StringBuffer때문

-StringBufferequals()가 오버라이딩 되어 있지않다. (주소비교) this==obj

-String은 내용비교

-StringBufferString으로 변환 후에 equals()로 비교해야 한다.

String s = sb.toString(); // sbString으로 변환

String s2 = sb2.toString();

System.out.println(s.equals(s2)); //true

 

 

package problemSolving;

public class Test1 {

	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer("01");
		StringBuffer sb2 = sb.append(23);
		sb.append('4').append(56);
		
		StringBuffer sb3 = sb.append(78);
		sb3.append(9.0);
		
		System.out.println("sb="+sb);//sb=0123456789.0
		System.out.println("sb2="+sb2);
		System.out.println("sb3="+sb3);
		
		
		System.out.println("sb="+sb.deleteCharAt(10));//sb=01234567890
		System.out.println("sb="+sb.delete(3,6));//sb=01267890
		System.out.println("sb="+sb.insert(3, "abc"));//sb=012abc67890
		System.out.println("sb="+sb.replace(6,sb.length(),"END"));//sb3=012abcEND

	}

}

'2021 Newlecture > JAVA' 카테고리의 다른 글

클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

클래스변수

자바프로그램은 클래스로만 구성이 되어있다.

메인메소드,변수선언,메소드선언 모두 클래스안에 있어야한다.

전체프로그램에서 변수를 딱 하나 선언해야할 경우에 쓴다.

전체프로그램 모두에서 공유한다.

그렇다면 공유할 변수를 어디에 둬야할까?

A클래스의 진영에만 쓸거면 A에넣으면되겠지만,

공유하려면? A?B?C?

좀더 연관이 깊은 클래스에 넣어주되, 공유하려면 누구나 접근할 수있게 static을 붙여준다.

 

Static 선언의 의미 :

이 변수는 공유할거야.

인스턴스 생성과는 별개로 하나만 존재하고 어디서든 접근가능

위치는 클래스안에 존재한다.

 

선언된 클래스의 모든 인스턴스가 공유하는 클래스 변수

InstNum이 인스턴스별로 존재한다면 값이 1일 것이다.

실제 출력하면 마지막 3이 출력된다.

  

클래스 변수의 접근 방법

클래스 내부 접근

static변수가 선언된 클래스 내에서는 이름만으로 직접 접근 가능

 

클래스 외부 접근

private으로 선언되지 않으면 클래스 외부에서도 접근가능

접근수준 지시자가 허용하는 범위에서 접근가능

클래스 또는 인스턴스의 이름을 통해 접근

 

클래스 변수의 초기화 시점과 초기화방법

클래스 변수는 생성자 기반 초기화 하면 안된다.

이 경우 인스턴스 생성시마다 값이 리셋

 

클래스 변수의 활용의 예

 

원주율 값은 클래스의 인스턴스별로 가질 수도있다.

굳이 인스턴스별로 유지할 필요없다.

인스턴스별로 자기네들이 값을 컨트롤해야할 때 필요하다.

PI값이 메모리에 저장되고 서로 공유한다.

어떤 상황에따라 바뀌어야한다면 참조되는 값만 바뀐다면

날씨정보를 실시간공유하듯이 사용할 수있다.

인스턴스별로 가지고 있을 필요가 없는 변수

값의 참조가 목적인 변수

값의 공유가 목적인 변수

그리고 그 값이 외부에서도 참조하는 값이라면 public으로 선언한다.

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

 

Wrapper class 사용이유?

기본 data type은 객체가 아니어서 Object로 받는 다형성을 지원 할 수없다.
기본 data type을 객체로 변환시켜 전달하기위해 사용되며 auto boxing과 unboxing이 지원된다

Wrapper class 
기본자료형 값을 감싼다.
인스턴스안에 넣어두는걸로 이해하면 좋다.
왜 감싸느냐? 제네릭에서 자세히배운다

 

예시 1.

class UserWrapperClass{
	public static void showData(Object obj){
    	System.out.println(obj);
    }
}

인스턴스를 요구하는 메소드

이 메소드를 통해서 정수나 실수를 출력하려면 해당 값을 인스턴스화 해야한다.

 

메소드 showData를 정의한다.
인자로 무엇을 전달받아서 toString메소드를 호출한다. 이때 인스턴스가 전달되어야한다.
기본자료형값을 보낼 수 없다.
인스턴스를 보내야하는곳에 기본자료형을 전달하면 컴파일에러가 발생한다.

 

showData 모든 인스턴스를 인자로 전달받을 수있다. 그 인스턴스가 반환하는 문자열을 출력한다.
기본자료형은 object클래스를 상속하지않기떄문에 인자로 전달할 수없다.

 

기본자료형의 값들은 인자로 받을 수없다. 오브젝트를 상속하지않는다
String str = 3이나 5를 참조할 수 없는것과 비슷하다

 

기본자료형의 값들은 인자로 받을 수없다.
오브젝트를 상속하지않는다
String str = 3이나 5를 참조할 수없다.

public static void main(String[] args){
	Integer iInst = new Integer(3);
    showData(iInst);
    showData(new Double(7.15));
}


내가 가진것이 값이라면 래퍼클래스를 이용해 인스턴스안에 넣어둔다
3이라는 숫자가 인스턴스화되었다.
7.15라는 더블형값이 더블이라는 인스턴스에 감싸여져서 그 반환값이 showData메소드의 인자로전달되었다.

* 래퍼클래스에서 중요한것은 값을 인스턴스화시킨것

 

이렇듯 기본 자료형의 값을 인스턴스로 감싸는 목적의 클래스를 가리켜 래퍼클래스라고한다.

 

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
클래스변수  (0) 2021.09.18
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

String , StringBuffer,StringBuilder 차이점

1. String 
새로운 값을 할당할때 마다 새로 클래스에 대한 객체가 생성된다.
String에서 저장되는 문자열은 private final char[] 의 형태이기 때문에 String값은 변경 할 수없다.
String + String + String은 각각의 String주소값이 stack에 쌓이고 GC가 호출되기 전까지 생성된 String객체들은 Heap에 쌓이기 떄문에 메모리관리에 치명적이다.

 

인스턴스안의 저장된 문자열을 바꿀수없다

한번 생성되면 문자열을 바꿀 수 없다.
참조변수는 참조하는게 다임

str1이 str2를 참조해도 문제가안생긴다. 둘다 참조만가능하므로 ..

백개의 참조변수가생겨도 문제가 안생긴다.
새 인스턴스가 아니라 기존 값을 반환해준다.

새로운 인스턴스가 필요하다면 new로 새 객체생성가능

2. StringBuffer
동기화지원
각 메서드 별로 synchronized keyword가 존재한다.

3. StringBuilder
동기화 미지원
동기화를 지원하지 않아 속도가 빠르다.

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

자바 컬렉션과 제네릭 강의 02-정수형 콜렉션 구현하기

-콜렉션 : 가변길이 배열. 저장소내용을 숨기고 값을 담을 수있다. (어디에 얼마나 저장되는지알필요x)

1.데이터관리 직접할필요없다

2.배열의경우 공간크기가 고정, 콜렉션은공간을 늘려준다.

-제네릭

 

 

자바 컬렉션과 제네릭 강의 03 - Object 클래스의 필요성

최상위 추상클래스

모든 클래스는 object이다. 

object가 필요한 이유는 ?

모든 객체를 섭렵할 수있는 범용 자료형이 필요하다.

object는 모든클래스를 참조할 수있지만 ,list배열에 3을 담을 수없다.

값은 참조하는게아니라 담는것이기때문

문제 : 참조변수는 공간을 갖고있지않아서 갑을 담을 수없다

자바 컬렉션과 제네릭 강의 04 - Wrapper 클래스와 Auto Boxing/UnBoxing

정수값을 담을 수있도록 도와주는 클래스가있다.

integer(); <-Boxing이라고한다

나중에 꺼낼때 unboxing : int x= obj.intValue();

integer x =3 ; 박싱 후 참조하는 형식

integer x = new Integer(3);

자바 컬렉션과 제네릭 강의 05 - Object 콜렉션으로 변경하기

범용자료형이다보니 두가지 문제발생

1. get(0)가 어떤값을 가지고있는지 확실하지않다

2. 형변환

자바 컬렉션과 제네릭 강의 06 - Generic 이란

자바는 모든것을 object형으로 만든다

형변환문제, 데이터를 담을떄의 문제점을 해결하기위해서 값을 넣고 빼는 부분에서 형식을 변환한다.

생성된 데이터형식을 자바에서는 object를 만들고 그 object를 가지고 데이터를 담고 빼줄때

사용자가 전달하는 자료형으로 형변환을 한다.

Generic은 무엇이든될 수있다.

두개의 인자를 가질수도있고, 몇가지옵션이있다

자바 컬렉션과 제네릭 강의 08 - 풀이 : 가변크기 컬렉션으로 변경하기

자바 컬렉션과 제네릭 강의 09 - 자바 언어에 포함된 콜렉션 프레임워크

선형데이터구조 : 링크로 연결된데이터, 삽입삭제가 유연

list.add(3) // 인덱스0인덱스로 식별가능

list.add(5) //인덱스 1

추가할수록 인덱스가늘어난다

 

set은 식별자가없다.  값이 곧 식별자다

'2021 Newlecture > JAVA' 카테고리의 다른 글

StringBuffer클래스  (0) 2021.09.19
클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11

기술면접준비할 것

 

컴파일언어 , 인터프리터언어 :

  컴파일 언어 : 3+4 를 컴파일(binary code)로 번역후 디스크에 저장 ->런타임 ->Execute (실행속도빠름)

  컴파일언어 : C,C++, Java, C#

  인터프리터언어 : 번역없이 실행 ->소스코드가 바로 디스크에있음 ->바로필요할때 필요한언어만 번역

 

*컴파일 언어 :

코드 번역 보조기억장치 메인메모리 실행

ex: C, C++

CPU안의 Control Unit이 실행

특정CPU에서만 동작

기계어를 직접 만들어 실행

메모리 관리를 해야함

한번에 미리 번역

배포시 구문오류 존재 X

실행환경 도구 필요X

 

프로그램만드는 순서 : 개체를 찾고 - 기능을 찾고 - 기능을 구현한다

 

생성자를 사용하는 이유 ?

초기화는 단 한번만 실행되어야한다.

초기화는 다른 어떤 로직보다 먼저 실행 되야한다

 

객체지향에서의 캡슐화 : 실생활의 내용을 그대로 표현하는 도구

개체가 하는 서비스함수(행위)를 모아둔것

기존 캡슐화 : 데이터변화에 영향을 받는것들을 한곳에 모아 둔것

객체지향 캡슐화 : 객체가 갖고있는 서비스들, 즉 객체가 제공해야할 서비스들을 모아둔것

 

객체지향이란 ?

프로그램을 구성하는 요소로서 객체라는 것을 중심에두고 프로그램을 만드는것.

 

객체지향의 장점 ?

코드의 구조를 실세계내용을 반영해서 인간의 사고에 가깝게 쉽게 표현한다.

 

객체지향프로그래밍이란 ?

  주어,목적어가 우선 ( 행위의 주체가 눈에 띄도록한다)

  함수는 동사, 행위

 

객체 : 보이는것, 실존하는것, 식별이름

        실체,인스턴스, 객체이름, 참조변수

개체 : 유형. 적절한 추상화가 필요.개별적으로 움직일 수 있는 유형

       실존하지않는 것 = 타입명칭 = 자료형명 = 형식명칭

 

추상화

개체(모듈,캡슐)3가지 목적으로 사용된다.

1. 큰거를 잘라서사용

2. 공통적이고 반복된 부분을 집중화

3. 잘라낸부분다음에 재사용

 

추상화 : (캡슐의)공통부분을 잘라내는 것

아우를수있는 추상적인 것

추상화도 is a 상속이다

 

객체지향 :

캡슐화->has a(역어내기)상속관계->알맹이를 틀로쓰거나(Is a 상속):오버라이드

->추상화(집중화/공통분모화) :오버라이드,추상클래스/추상메소드

->다형성(분리와 도킹:인터페이스)

 

기본기가 중요하다.

대화가안되고 응용이안되면 XX

 

자바플랫폼 :

윈도우 프로그램(AWT), 파일입출력(FIle), 서블릿(HTTPServlet, HttpServletRequest,HttpServletResponse…)

'2021 Newlecture > JAVA' 카테고리의 다른 글

클래스변수  (0) 2021.09.18
Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11
(추가정리) 상속  (0) 2021.04.10

Inner class

YBMExamConsole 안에 내부클래스만들고 내부클래스에서 인터페이스 구현하기

내부클래스 객체만들기

import하거나 앞에 outer 클래스명써주기

YBMExamConsole만든사람이 내부클래스 객체화도 같이하도록

생성자안에 중첩클래스생성자 넣음

ex7 상속 has a 파트에서 일체형과 동일한 형태이다.

YBMExamConsole()객체를 생성하면서 동시에 XXX()객체생성하는것.

인터페이스 구현목적인 익명클래스

XXX라는 클래스명은 x라는 객체꽂기위함 - 1회성

Banner banner = new Banner()  { 인터페이스구현 }; 클래스명없음

setBanner(banner);

 

'2021 Newlecture > JAVA' 카테고리의 다른 글

Wrapper class  (0) 2021.08.22
String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11
(추가정리) 상속  (0) 2021.04.10
(추가정리)this키워드  (0) 2021.04.10

캡슐화

-은닉성

 

상속(has A / Is a)

has a : 분리형, 일체형

is a single / multi (x) : extends , implements

 

추상화

-공통분모 : abstract 클래스, abstract 메소드

 

다형성

-절차의 일부분을 분리할 수 있다 - 인터페이스가 필요하다.

-절차의 분리와 도킹

 

자바 인터페이스 : 객체와 객체를 이어주는 접점

인터페이스 : 사물 또는 공간을 이어주는 접점

인터페이스를 통해서 정의하고 구현하고 사용하는 절차가 접함이되면 ?

다형성이 발생

 

일부 절차가 인터페이스로 정의된다 ?

A클래스가 인터페이스를 정의하였다.

 

인터페이스를 구현하는 방법 4가지

1. 외부클래스로 구현 : public class YBMBanner implements Banner

2. 내부클래스로 구현 : public class YBMExamConsole extends ExamConsole implements Banner

3. 메소드내의 중첩클래스로 구현 : 생성자 public YBMExamConsole(){ YBMExamConsole.XXX x = this.new XXX(); }

                                            YBMExamConsole 클래스내에 class XXX implements Banner

4. 익명클래스로 구현 : Banner banner = new Banner() { 구현 } 

5. 람다식이용한 구현

 

중첩클래스의 용도가 꼭 인터페이스용은 아니다.

인터페이스를 객체화할 수없다.


인터페이스의 메소드를 구현할때 부모의 메소드명과 동일하다면 ? 

부모것을 재정의한것처럼되어버림

좌 : 재사용하는 자식 / 우: 부모클래스

부모의 메소드를 오버라이드, 인터페이스를 구현하는것

부모가 이미 print()함수를 가지고있다. 인터페이스가 구현하려는것도 print()다.

->부모것을 재정의한것처럼되어버림

 

인터페이스의 구현은 다른클래스에서해도되지만

부모클래스의 메서드를 오버라이드하는일이 발생한다.

또 클래스를 만든다 ? 이게 부품이라고 할 수있나 ? (너무작은부품들로 개체수가 느는것)

->바람직하지않음

 

클래스안에 클래스가 정의될수있다. (인터페이스구현하기위한 울타리) 메소드충돌

 

좌 : outer / 우 : inner

 

프린트호출할때 a는 두가지 this가 전달된다 

1. 울타리밖에있는 객체의 인스턴스 (YBMExamConsole)

2. XXX의 인스턴스

 

중첩된 클래스의 객체화

import부분에 클래스명 

또는 XXX(inner 클래스)앞에 Outer클래스를 써준다.

클래스안에있는 클래스사용시 import를 하거나 직접 객체앞에 써줘야한다.

 

inner클래스의 객체는 outer객체를 통해 만들어진다. 

new XXX()객체는 outer객체를 통해 만들어져야한다. 

outer를 통해서 만들어져야한다.

outer객체가 갖고있는 new라는 연산자사용

 

 

 

main()이아니라 YBMExamConsole을 작성하는 사람이  XXX의 객체를 만든다.  

초기화작업은 YBMConsole만든사람이 하는게낫다.

XXX객체생성을 YBMExamConsole생성자에넣는다. 

XXX객체생성을 YBMExamConsole생성자에넣는다. 

인터페이스를 메소드내 중첩클래스로 구현 

new연산자앞에 this.객체가있었다
생성자내에 중첩클래스 : 메소드내 중첩클래스 

중첩클래스의 this :두개의 this가 올 수있다. 

outer클래스의 a가 선언되고 inner클래스의 a가 선언되었을때

우선순위가 적용된다. 자기것 (inner)의 a가 호출된다.

outer의 a를 출력하고자 한다면 ?

그냥this쓰면 inner의 this

 

Outer클래스명을  쓰고 this를 쓰면 내부클래스의 a가 출력된다. 

 

 

setBanner(x)에 넣기위해서 생긴 익명클래스

좌: 내부클래스의 이름을 없애고 우: 익명클래스로 바꿈 

 

 

 

'2021 Newlecture > JAVA' 카테고리의 다른 글

String , StringBuffer, StringBuilder 차이점  (0) 2021.08.20
자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11
(추가정리) 상속  (0) 2021.04.10
(추가정리)this키워드  (0) 2021.04.10
(추가정리) 패키지와 static  (0) 2021.04.10

추상클래스

클래스의 공통된 부분을 뽑아서 별도의 클래스(추상클래스)로 만들어 놓고, 이것을 상속해서 사용한다.

추상클래스 구현

클래스 상속과 마찬가지로 extends 키워드를 이용해서 상속하고 abstract(추상)메서드를 구현한다.

Bank추상클래스

인터페이스 vs 추상클래스

인터페이스란?

클래스와 달리 객체를 생성할 수는 없으며, 클래스에서 구현해야 하는 작업명세서이다.

인터페이스를 사용하는 이유

가장 큰 이유는 객체가 다양한 자료형(타입)을 가질 수 있기 때문이다.

인터페이스 구현

class 대신 interface 키워드를 사용하며, extend 대신 implements 키워드를 이용한다.

interface를 이용하면 객체가 다양한 자료형타입을 가질 수 있다.

'2021 Newlecture > JAVA' 카테고리의 다른 글

자바 컬렉션과 제네릭 강의  (0) 2021.04.25
자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 상속  (0) 2021.04.10
(추가정리)this키워드  (0) 2021.04.10
(추가정리) 패키지와 static  (0) 2021.04.10
인터페이스  (0) 2021.04.08

상속이란?

부모 클래스를 상속받은 자식 클래스는 부모 클래스의 속성과 기능도 이용할 수 있다.

상속의 필요성

기존의 검증된 class를 이용해서 빠르고 쉽게 새로운 class를 만들 수 있다.

상속 구현

extend 키워드를 이용해서 상속을 구현한다.

최상위->상위클래스가 먼저 생성된다.->자식클래스 생성

자바는 단일상속만 지원한다

(다른언어:extends Class1, Class2,...)

 

자식클래스 객체를 만들면 부모생성자가 먼저실행된 후 자식생성자가 실행된다. 

부모 클래스의 private 접근자

자식 클래스는 부모 클래스의 모든 자원을 사용할 수 있지만, private 접근자의 속성과 메서드는 사용할 수 없다.

 

메서드 오버라이드

부모 클래스의 기능을 자식 클래스에서 재정의 해서 사용한다.

자료형(타입)

기본자료형 처럼 클래스도 자료형이다.

모든 클래스의 최상위 클래스는 Object 클래스이다.

상위 클래스를 호출할 때 super 키워드를 이용한다.

'2021 Newlecture > JAVA' 카테고리의 다른 글

자바 총 정리  (1) 2021.04.13
Inner class / Anonymous class  (0) 2021.04.12
인터페이스 구현  (0) 2021.04.12
(추가정리) 추상클래스 와 인터페이스  (0) 2021.04.11
(추가정리)this키워드  (0) 2021.04.10
(추가정리) 패키지와 static  (0) 2021.04.10
인터페이스  (0) 2021.04.08
protected method() / 자식에게 부모 객체넘겨주기  (0) 2021.04.07

디폴트 생성자

객체가 생성될 때 가장 먼저 호출되는 생성자로, 만약 개발자가 명시하지 않아도 컴파일 시점에 자동 생성된다.

디폴트 생성자 외에 특정 목적에 의해서 개발자가 만든 생성자로, 매개변수에 차이가 있다.

this 현재객체를 의미

 

다른패키지에있는 클래스를쓰려면 패키지풀네임.클래스이름으로 import해야한다

또는 패키지풀네임을 적을 수도있다
dailyJournal안에있는 모든클래스

static변수

동일한클래스에서 만들어진객체는 메모리상에 별도로존재 . 아주다른 별개 객체

static키워드가 붙은변수는 서로 데이터를공유

 

 

인터페이스

인터페이스란 두 사물 또는 세계가 간접적으로 만날 수 있게해주는 도구 또는 접점

자바 인터페이스란 객체 간의 조립을 간접적으로 조립하게 Has A 상속을 하게 해주는 접점 또는 도구

객체가 다른객체를 사용할때 이용하는 접점

코드의 일부분을 인터페이스로 약속해서 뺼 수 있다.

 

배너를 바꾸고싶다면                                                                                        (노란색이 인터페이스) 

옛날 배터리분리형 폰을 생각해보자. 

나중에 부품배터리 꽂아사용할 수있다. 

배터리를 사용하도록 약속되어있는 접근방법(노란색단자)을 제공해야한다.

다형성제공(배터디, 다양한제품을 쓸 수있다, 대용량 ,저용량, 기호나 사정,상황에맞게 배터리를 쓸수있다)

다양한 형태의 결합을 통해서 다양한 형태를 만들어 낼 수 있다.


public interface Banner

정의하는쪽 (제품쪽) : 코드의 일부분을 비워놓고 

구현하는쪽(부품) : 꽂아넣기 

 

인터페이스는 구현하는게 아니라 약속으로 정의한 00을 구현할 목록나열

약속으로 수반되어야할 목록을 무엇으로 구현해야하는지 정의

  • 멤버변수가없다. 
  • 다른 접근제한키워드를 쓰지않음 
  • Banner가 함수의 목록만 정의
  • 약속이기때문에 지금구현하지않는다.
  • 나중에 누군가 (YBMConsole)가 구현할 것 

public void setBanner(Banner banner)

기능을 분리하고자하는 쪽에서 기능을 정의해야한다.

정의한것을 다른쪽에서는 구현해야한다. 

interface Banner라는 약속으로 print와 printEnd를 구현한 객체를 private Banner banner;에 대입해주기 위한 도구

좌: 배터리를 꽂을수 있도록 변수를 두고/  가운데 : 배너 정의(배터리사용하는쪽) / 꽂아넣을수있도록 setter준비 

나중에 누군가가 banner 객체를 만들면 받아와야함 - 구현한쪽에서 꽂아줘야하니까 set메소드

(set()이없으면 내가 구현해야함)

내가만들지도,구현하지도않을것 - 들어올수있게하는방법이 set()메소드임.


인터페이스에 필요한 4가지 역할

  • 인터페이스는 약속을 정의하는것 (interface)
  • 마감(ExamConsole) : 인터페이스의 함수를 호출
  • 인터페이스구현(YBMBanner) : 
  • 구현한것을 꽂다 ybmConsole.setBanner(exam)

YBMBanner를 다른패키지에서 해야하지만 편의상 같은패키지에서 생성

ExamConsole에 ybmBanner를 꽂는것


YBMBanner가 Banner를 구현한다. 

배터리꽂아야 핸드폰을 킬 수 있다. (인터페이스를 구현하다)

인터페이스도 부모형이 참조가능하다.

 

 

약속을잡아놓고 구현하겠다 남이구현하게하겠다

1.자식만(onPrint) 2. 객체넘겨주는것 

꽂아주는작업 :인터페이스 

코드분리 ->누군가가가구현 -> 성질이 다양하게 바뀔 수있다. 

인터페이스는 다중상속을 대신한다

인터페이스를 구현하는 클래스가 반드시 새로운클래스일 필요없다.

 

자식만 구현하게하는것 / 객체로 누구나 구현할수있게하는것 

YBMExam이 Exam을 상속함 - onPrint는 자식이 구현하로했다.

약속해놓고 자식이 구현했다.

인터페이스로도 가능하다. 인터페이스목록으로하면 다른객체로서도 extends안해도 제공할 수있다. 

YBMExam이 인터페이스를 구현했다면 ? 

인터페이스는 클래스를 만드는게 중요한게아니라 구현했는지가 중요한것


클래스는 하나의 상속, 인터페이스 추가가능.

 


장소가 적합한가에대한 문제 

 

객체지향프로그래밍

캡슐화 -> 엮어내기(has A) -> 상속(Is A) / 추상화 : ->다형성(인터페이스).

 

캡슐화 :기능들을 서비스캡슐화

Has a : 여러캡슐들을 엮어서조립

Is a : 남의것을 상속받아서 고쳐쓰기

추상화 : 내것을 남이 쓸수있도록 골격을 만들어냄, 자식이 구현

 

추상화 : 일부분만 고쳐쓸때 (부모의 super.input()을  호출)가 있다.

 

public class YBMExamConsole extends ExamConsole : Is a 상속

YBMExamConsole은 구현안해도 내가 만든것처럼 보여줄수 있다. 또는 부모것을 고쳐 쓸 수 있다.

 

객체화하지않게 하려면  abstract class 

자식이 꼭 구현하도록 강요하려면 abstract method()

 


호출 프로세스 (데이터가 확장되면 출력이 문제가 된다)

순서: console.print() -> 부모의 print() -> 부모 print()안의 onPrint() -> 오버라이딩된 onPrint() -> onPrint()호출된곳으로돌아감->print()호출된곳으로 돌아감

ExamConsole사용하다가 exam객체가 달라졌을 경우 ?

국영수가아닌 다른과목이 포함되어야할 경우?

 

기존의 Console을 확장해서 NewExam에 맞게 콘솔을 다시작성해야하는 상황이 발생한다.

→데이터확장 → 자식클래스도 확장 →다시다상속관계 =>해결 : 없음

 

  • 상속받아서 고치는데, 최대한 부모것을 재사용하도록 재사용범위를 넓혀야한다.
  • 부모가 확장을 염두해두지않고 만들어지면 재사용 불가능
  • 함수하나만들어서 자식에게만 노출되는 함수 (onPrint() )
  • onPrint()는 자식이 활용하기 위해 아무코드가 없다. 자식이 사용예정
  • Frame에서 setVisible()과 같다.

 

Exam형인 getExam을 NewlecExam으로 형변환 해준다.

 

getExam()을 사용하면 자료형이 Exam이다.

Exam객체는 getCom()을 가지고있지않으므로 형변환 해줘야한다. 

 

YBMExam exam = (YBMExam)getExam();

자식YBMExam은 getExam()(객체가져오는메소드)가 없고, 부모Exam은 setToeic()이없다.

부모에게있는 getExam()을 자식으로 형변환해서 가져온 후

자식YBMExam에있는 setToeic(), getToeic()을 호출한다.

 

각 참조변수자료형에 따라 어떤 메소드가 없는지 알 수있다.


protected void onPrint()

다음에 클래스를 재사용한다면 추상화 ->공통분모제공.최대한 공통분모를 재사용할수록해야한다

모든자식은 ExamConsole을 틀로쓰겠다는거잖아요

  • 자식입장에서 부모로 뒀을 경우 자식은 print()기능을 내가 구현하지않고 부모기능을쓰는게더좋겠죠.
  • 부모ExamConsole이 protected void onPrint()를 가지고있되, 구현은 자식이 해서
  • 자식객체가 바뀌었을경우 재정의해서 사용할 수있도록한다.

부모 ExamConsole클래스의 print()함수 내에 onPrint()넣음

자식이 재정의하면 재정의한 것을 호출하도록했다.

ybmConsole은 마치 자기가 구현한것처럼 실행한다. 


Protected Exam getExam() // 자식이 부모의 멤버변수에 접근하도록 getter메소드생성

자식 ybmConsole에서 Exam exam을 사용할 수없음

내가 가지고있는 데이터가 자식에게 사용할가능성이있다면 , 자식이 사용할수있게끔 기능을 제공해야겠죠

이게없으면 다른애들이 exam사용불가, 자식이만 사용하도록 protected

 

부모가갖고있는 private Exam exam은 자식도 못쓴다. 일정한서비스를통해 넘겨사용(getter)

exam이 다른자식들이 이용하게끔 최대한서비스를 해주는 것 ->추상화클래스역할

최대한쉽게 재사용할수있게해주고 데이터제공.

YBMExamConsole이 부모의 onPrint()를 재정의하기위해 부모객체가 필요하다.


오버라이드비교

onPrint()는 부모것 불러올게없다.

input()은 부모의 input()을 받은 후 진행해야한다. 즉 국,영,수를 받고 토익,a를 받도록 해야한다.(출력순서에따라)

 

package ex8.추상화.재사용;

import java.awt.Frame;

public class Program {

	public static void main(String[] args) {
		
		Exam exam = new YBMExam(1,1,1,1,1);
		
		YBMExamConsole ybmConsole = new YBMExamConsole();
		ybmConsole.setExam(exam);
		
		ybmConsole.input();
		ybmConsole.print();
   }
}
package ex8.추상화.재사용;

import java.util.Scanner;

public class ExamConsole {
	private Exam exam; //부품으로씀
	private PrintListener printListener;
	


	public PrintListener getPrintListener() {
		return printListener;
	}

	public ExamConsole() {

	}		

	public ExamConsole(Exam exam) {//오버로드생성자만들때 기본생성자만들어야함
		super();
		this.exam = exam;
	}

	public void setExam(Exam exam) {
		this.exam = exam;
	}
	
	public void setPrintListener(PrintListener printListener) {
		this.printListener = printListener;
	}
	
	protected Exam getExam() {
		return exam;
	}
	
	protected void onPrint() {
		
	}

	public void print() {
		System.out.println("-----------------------------");
		System.out.println("            성적 출력          ");
		System.out.println("-----------------------------");
		System.out.printf("kor:%d\n",exam.getKor());
		System.out.printf("eng:%d\n",exam.getEng());
		System.out.printf("math:%d\n",exam.getMath());
//		if(printListener != null)
//		printListener.onPrint();
		onPrint();//호출
		System.out.printf("total:%d\n",exam.total());
		System.out.printf("avg:%f\n",exam.avg());
		System.out.println("-----------------------------");
	}
	public void input() {
		Scanner scan = new Scanner(System.in);

		int kor;
		int eng;
		int math;
		System.out.print("kor:");
		kor = Integer.parseInt(scan.nextLine());
		System.out.print("eng:");
		eng = Integer.parseInt(scan.nextLine());
		System.out.print("math:");
		math = Integer.parseInt(scan.nextLine());
		
		exam.setKor(kor);
		exam.setEng(eng);
		exam.setMath(math);
		
	}

}
package ex8.추상화.재사용;

import java.util.Scanner;

public class YBMExamConsole extends ExamConsole{
	@Override
	protected void onPrint() {
		YBMExam exam = (YBMExam)getExam();
		System.out.printf("Toeic:%d\n",exam.getToeic());
		System.out.printf("aa::%d\n",exam.getAa());
	}

	@Override
	public void input() {
		super.input(); //국영수먼저 받고
		
		Scanner scan = new Scanner(System.in);
		
		int toeic;
		int aa;
		
		System.out.print("toeic:");
		toeic = Integer.parseInt(scan.nextLine());
		System.out.print("aa:");
		aa = Integer.parseInt(scan.nextLine());
		
		YBMExam exam = (YBMExam)getExam();//부모형은 자식형으로바로안
		exam.setToeic(toeic);
		exam.setToeic(aa);
		
	}
}

추상화 

1. 네모,세모,원,선을 만들다 보니 동일한 서비스들이 있다→ 동일한 기능을 일괄적으로 관리하기위해 추상화된 자료형 도형을 만들다.

2. 성적관리프로그램을 만들다 성적관리프로그램을 기반으로 만들어지는 제품을 위해 (다음에도 계속 사용하기위해) 공통분모화,추상화를하다.

 

DI (조립)

1. Constructor (생성자 종속성 조립)

2. Setter DI

 

  • 추상클래스는 추상메소드를 가지고 있다.
  • protected : 자식만 구현하도록 추상부모클래스에서 메소드에 제한거는것. 자식에게만 공
  •                같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
  • 부모의 private 멤버변수는 자식에게도 안보인다.
  • 클래스가 상속할 (자식을 낳을) 준비가 되지않았다면 , 재사용하기 불가능할 수 있다.
  • 객체가 YBMExam일때 출력도구도 달라져야한다. 
  • YBMExam전용 콘솔도구를 만들어야한다. 그때 ExamConsole이 재사용할 준비가 안되었다면 자식이 재사용할수 없게된다.

 


 

고쳐쓰는 방법 1 : 추상화 

사용자를 위한  껍데기부분을 만들때 상속이 많아지는 문제가 발생한다.

 

Exam class에 abstract를 지우고 시작.

출력을 위한 ExamConsole class{ }를 만들고 Exam class에 getter, setter를 추가한다.

 

Exam은 아직 객체를 갖지않았다.

객체를 갖는방벙 2가지

1. 객체를 자기가 만들거나

2. 남이 객체를 만들어서 넘겨주는것

 

ExamConsole console = new ExamConsole(exam);

ExamConsole 은 exam없이는 살 수없다.

exam을 생성할때 한번 꽂으면 더이상 다른 exam으로 대체할 수 없다.

Constructor DI : Dependency(종속성) Injection(주입) 생성자 종속성 주입

부품을 껴넣다.

AssoAssociation Has A 관계를 Injection하는것 => DI라고 한다.

ExamConsole은 exam을 분리형태로 부품으로 쓴다. 조립형

 

console.setExam(exam); 

언제든지 다른 객체로 바꿀 수 있다.

 

다양한 객체를 부품으로 사용한다.

Dependency: 재료가 되는 객체를 말한다. (has a)

exam은 ExamConsole이 자기 부품으로 쓰는것

Random은 함수를 일시적으로 쓰는것.

 

객체를 부품으로 사용한 예

필드를 사용하는 초기화하는 생성자

마우스오른쪽 -> source -> Generate constructor using fields

 

ExamConsole()와 ExamConsole(Exam exam) 생성자 공존 할 수없다.

Exam exam은 null이고

객체를 꽂을 수 있는 방법은 ExamConsole(Exam exam) 를 통해서만 가능하다.

ExamConsole()를 지우면 사용자는 ExamConsole(Exam exam)을 통해서만 객체를 생성할 수있다.

(기본생성자를 지우면 exam을 넣어야하는상황이된다)

 

ExamConsole()를 가능하게 한다면 

사용자가 기본생성자를 쓸 수있고 출력시 null값이 나온다.

생성할때 exam을 껴놓는 이유  ?  (exma)

 

exam을 생성자를 통해서만 만들게 했을까 ?

ExamConsole의 모든기능은 exam없이는 사용할 수없다.

 

e.g 스캐너도 기본생성자가없다. 입력스트림객체를 넣어줘야한다. 꽂지않으면 오류발생

객체를 넘겨줘야만 사용할 수 있다.

 

ExamConsole은 exam없이 독단적으로 사용가능?

사용할 수 없다.

ExamConsole은 반드시 생성하자 마자 exam을 갖고있어야 한다.

 

만약 누군가가 기본생성자를 호출한다면 내가 만들어주는것으로

public ExameConsole(){ exam = new Exam(); }

기본생성자를 저렇게만들면 밖에서 ()으로만으로도 할수있음

만들기나름,기획하기나름,선택가능

일체형
밖에서 호출할때

Setter를 통해 객체전달

Exam에 set함수 만들기

 public abstract int total();

total은 국,영,수뿐만 아니라 다른과목도 추가할 수 있어야한다.

국,영,수 합계를 자식이 직접계산할 필요는 없다. YBM ,다른고등학교에서는 과목이 달라질것이므로 고쳐쓸 수 있게한다.

상속을 통해 고쳐쓴다.

Exam클래스의 total 수정
NewExam에서 오버라이드한 모습

protected 

baseTotal()이 public이면 상속받는 자식에게만 구현하도록 만든 서비스이다.

자식에게만 보이게하는 키워드

내가 공통분모고 abstact, 자식만 구현하록하고싶을때 사용 

 

 

고쳐쓰는방법 2 : 인터페이스

 

객체를 YBMExam으로 바꿨는데, 여전히 국,영,수만 출력이된다.

지금 이그젬에만 특화되어있다

기존코드를 고치는 방법에 대해 ..

콘솔: 사용자에게 출력하는코드

exam은 자식을 계속 낳을 수 있다.

examConsole은 어떤객체(어떤자식)이꽂아질지모른다.

프린트가 부모영역으로만 한정된출력을가지고 있다.

달라져야한다 프린트의 기능이 객체종류에 따라 달라질 필요가 있다

 

저안에 들어갈 국영수외에 확장될부분을 너가 책임져줘.

단 구현해놔. 구현하지않으면 안하는거고~

자바는 함수만 꽂는건불가능 클래스안에 넣어야한닫.

onPrint를 구현해줘

누군가가 함수를 구현해서 객체를 넣어주기만 하면 ExamConsole을 재사용할 수있다.

public interface PrintListener 

함수에대한 약속만 나열한것 (구현x)

함수내용을 구현해서 꽂아넣었다면 

Summary

  • 추상클래스 : 공통클래스
  • abstract라는 키워드로 객체화를 못하게하고, 메소드가 재정의 되도록 할 수 있다.
  • abstract 메소드 : 일괄처리를 위해 부모 영역에 둔다. (서비스항목만 공통 / 구현은  공통이 아님)

 


추상화로 만들어진 클래스의 특징
1. 추상클래스는 뼈대이므로 절대로 실체화 되어서는 안됨.(객체화X)
2. 추상클래스는 뼈대이므로 반드시 재정의 해야하는 메소드가 있다.


 

객체지향 프로그래밍

캡슐화 : 개체가 하는 서비스함수를 모아둔 것.. ?

캡슐 : 주체, 대상

 

캡슐의 조립 : has a(조립) / is a (고쳐서 쓰는형태)

 

Is a 상속

-오버라이드

-생성자 오버로드

-super

-참조형식의 다양화

-동적바인딩(참조형식이 부모일 경우의 상황)

(오버라이드, 주소, 자식객체) 

추상화 

다형성 

 

추상화

개체(모듈,캡슐)가 3가지 목적으로 사용된다.

1. 큰거를 잘라서사용

2. 공통적이고 반복된 부분을 집중화

3. 잘라낸부분다음에 재사용

 

추상화 : (캡슐의)공통부분을 잘라내는 것

아우를수있는 추상적인 것

추상화도 is a 상속이다

 

클래식,자동차,세단,suv 의 공통분모 : 자동차

사람+토끼 : 동물

동물,생물의 공통분모 : 생명체

전투기,적기 : 비행기

*Bottom→ up

고도화작업/리팩토링

 

*Top→down :

공통적인것 -> 구체적인것 만드는 것

설계가 잘되어 있어야할 때 (바람직한 방법)

 

 abstract : 실체화되지못하도록 막는작업

Exam은 뼈대일 뿐 객체화되지 않게한다.

YBMExam와 NewlecExam들이 구체화될 것.

Exam클래스에 abstract를 붙이면 객체 생성할 수 없다라고 뜬다.

abstract는 결여된 부분이있기때문에 객체화될 수 없다.

 

추상클래스: 공통분모지만 객체화해야하는 경우가 있나요 ?

반드시 객체화되지 않아야하는건 아니다. (abstract를 붙이지않는 경우)

 

e.g. AWT(Abstract Window Toolkit 추상화된클래스)

Frame : 추상클래스

이것만가지고 쓸필요가있다면 쓰라고 마음으로만 추상클래스로 준비

코드로는 abstract를안붙여놓은것도 추상클래스가 될 수 있다.

객체화되지않길원하면 abstract를 붙여 실체화 못하도록 막을 수 있다.

 

 

추상클래스를 만들다보면 강요하고싶어질수가있다.

부모참조형식인 이유 ? 

Exam을 한 이유는 일괄관리를 하기위해 , 범용적으로 쓸수있는자료형

참조형식이 YBMEame이면 객체도 YBMEame만 쓸 수 있다.

네모,세모,원의 공통분모는 도형이다. 도형이라면 자식모두를 참조할 수 있다.

moveBy()기능이 서로 다르게 구현되었더라도 도형에 있어야만 한다. 

일괄적으로 관리하는 이유

부모 Exam에 avg()가 있어야하는 이유 ?

각각다르게구현되더라도 부모에 avg()가있어야한다.

Exam이 avg() 가지고있어야 일괄적으로 자식을 관리할 수 있다.

자식객체만 avg를 갖고있다면 일괄관리가 불가능 (e.g. exam.avg()오류발생)

1. 오버라이드를 해야해서 ? (X)

2. Exam으로 참조하려면 Exam클래스안에 avg()가 있어야한다 (△)

3. 일괄관리를 위해서, 범용적으로 쓸 자료형이 필요하다. 일괄적인 행위를 구현하기위해.

Exam의 avg()구현은 없애고 구현내용은 자식이 한다.

일괄처리를 위해 함수는 두지만 구현은 공통이아니다.

몸통은 상속하는 클래스들이 할것.

추상메소드

추상클래스가 갖고있는 공통기능을 의미

기능은 공통으로 가지고있고, 구현은 공통이 아니다.

서비스 항목만 공통으로 가지고있다.

 

상속하는애들이 구현 .자식이 구현책임을 갖는다.

자식이 무조건 오버라이드해야함

자식클래스에서 추상메소드를 구현하도록 에러메세지발생

 

 abstact 메소의 의미 

추상처리안하면 : 자식은 오류가안나니까 부모것을 그대로 사용할수도있다.

부모: 자식이 반드시 구현하도록 명시화,

자식: 모든자식이 구현하도록만드는 것

avg()메소드의 경우 NewlecExam 객체, YBMExam객체에서 각각 따로 구현되어야한다.

재정의 하지않으면 부모것을 그대로 실행하게되는데, 그럼 의도한 결과가 나오지않는다.

각 객체마다 가지고있는 멤버변수가 달라 구현과정이 다르다.

좌: YBMExam / 우 : NewExam


 

정리

1. 부모자식관계에서 자식클래스 객체는 부모클래스형식으로 참조가가능
2. 부모형식으로 참조할경우 : 객체가 자식이면 자식이 갖고있는 오버라이드가 우선이다.
부모형식의 정의된 함수목록으로만 함수호출이 한정된다
3. 벗어나고싶다면 형변환해야한다


캡슐():개체->실체,객체,인스턴스

캡슐 함수를 포장 : 메소드(스태틱,인스턴스) -> 차이점 ?

스태틱은 인스턴스를 넘겨받지않는다.

인스턴스메소드는 객체를넘겨받는 메소드다.

인스턴스를통해서 사용. this사용가능

 

캡슐이 객체지향에서 가장 기본 모듈 단위이다.

캡슐과 캡슐을 엮어서 프로그램을 만든다.

 

조립관계 : has A 관계 (부모가 부품)

틀로 사용하는 관계 : Is a 관계 (부모가 틀) , 일반적인 상속

->틀에 덧붙이거나 메소드 수정하거나, 사용자에게는 마치 내가 제공하는것처럼 보임,ㅠ 고쳐사용하는 메소드 : 오버라이드

 

오버로드 메소드: 기존메소드보다 인자를 확장 또는 추가 또는 수정된 메소드

                       (기존메소드에  인자가 추가된, 형식이 다른메소드, 새로운 메소드)

 

생성자:초기화하는 함수 init()

두가지 초기화조건이있어야 한다

1. 객체가 생성되자 마자 초기화 되어야한다. (new Eaxm(); 수동으로 우리가 객체를 생성하며 호출한것)

2. 한번만 초기화가 되어야한다.

 

B extends A처럼 두 클래스가 Is A상속관계에 있을때는 생성자가 두 번 호출된다.

New B()에서 A의 기본생성자를 호출하는 방법은 ? super(); //부모객체 ,자식에 의해 만들어진 객체

 

B extends A처럼 두 클래스가 Is A상속관계에 있을때는 new B()객체를 참조할 수 있는 참조형식은 두가지가 가능하다. 어떤형식인가 ? BA (B안에있는 A도 참조할 수 있다)


함수 호출 관계

오버라이드우선

 

부모안에 total()이 없어서 오류 /      부모안에 f6()없어서 오류

형변환: ((B)a).f6();

  • A형을 B형식으로 먼저바꾼 뒤 f6()을 호출해야한다.
  • (B)a.f6() 오류 : a.f6(을 호출하고나서 형식을바꿈

문제1 . 오버라이드우선

부모함수가 f3()을 호출했고 객체가 B객체고 오버라이드되었다면 자식의 f3()이 호출된다. 

두 그림의 결과 f3()으로 동일

오버라이드되서 자식의 f3()이호출된다.

 

문제2 . 무한루프

 

문제3. 오버라이드함수의 우선권 : F4는 오버라이드되서 먼저 불려와진다.

  • 형식이 A이더라도 객체가 B면 B의 메소드를 호출한다.
  • 함수호출이 번역이되면 어셈블리어로 바뀐것을 보면 JUMP 주소 으로 바뀐다.

함수가있는 위치의 주소로 맵핑된다. 함수이름이 결국 주소로되서 주소로 가게된다.

함수가 주소가 맵핑될때 , 주소를 결정짓는 과정에서 컴파일러가 A가 자식이 여럿이 있다면 

자식이 B,C 등 있을 수 있는데, 그 동작은 어떻게되는가 ? 

  • 어떤것을 기준으로 주소를 바인딩하는가 ?
  • A형식에 맞춰서 A안에있는 f3()를 주소로 바인딩한다.
  • 함수라는게 호출될떄 함수주소로 번역하는것 : 바인딩 

메소드 동적 바인딩 (함수 호출 위치 결정 방식 이해하기)

C++와 자바의 차이점

NewlecExam을 호출하려면 virtual를 써줘야한다.
virtual를 붙이면 바인딩을 미룬다.
함수의 위치를 객체가 가진다. 객체가 갖고있는 상자를 열어서 점프하게한다.
전달되는 객체에따라 달라진다.

컴파일 : static 바인딩 (virtual 아닌것)
실행 : dynamic 바인딩 
다이나믹바인딩, 동적바인딩 : 컴파일할때 바인딩하지않도록하고 실행할때 (자바는없음)
객체가 가지고오는 주소로가라. 실행되어야만 알 수 있다.

 

자바는 모든 메소드가 virtual이다.
자바는 모두 동적바인딩

 

자바의 함수 호출

자바는 동적바인딩만 지원하므로 모든 함수호출이 점프하는곳이 결정을 미룬다.


점프할곳을 어떻게찾는가 ? 
클래스가 만들어지면 점프번지를 기록하는 virtual 테이블이존재. 위치정보를 가지고있음
객체가만들어질때 추가적으로 4바이트씩 더 가진다.
그 4바이트가 자기가 가지는 메소드의 위치를 기록하는곳을 가리킨다. 
객체가전달될때 전달된 객체의 앞머리를통해 그쪽 total()로가게된다.
전달된 내용의 앞머리를 통해 virtual 테이블의 주소로 간다.
전달되는 객체가 뭐냐에따라 달라지게된다. 전달된 객체가 뭐냐에따라서 전달된 객체의 함수로 가게된다.
동적으로 실행해봐야 아는, 실행중에 주소가 결정되는 시스템


함수호출시 항상 자료형보다는 전달되는 객체가 뭐냐가 중요하다.
자료형: 형식은 한정만 시킨다.

 

A형식이라는것의 의미 : A가 가지고있지않은 멤버를 호출할 수없다.
e.g : a.f6();

 

자바는 컴파일할때 함수위치를 알려주지않고 객체가 위치를가지고있고 그 함수를 우선으로 호출된다.

int total = jump [    ];

함수주소가 A가 가지고있는 주소를 벗어나 자식이 전달될 수 있다고 생각하고 비워놓은상태 , A 범주내에서 호출되게끔하되 자식이 재정의한것을 넘겼을경우 자식이 호출될 수 있도록 잠깐비워둔 상태, 동적바인딩이라고한다.

나중에바인딩-다이나믹바인딩
A의 자식들의 객체가 전달될 수 있게금 비워두는것
나중에 전달된 객체를 찾고 실행중에 찾아서실행 (동적)

 

new Exam객체 : 12바이트 + 4바이트(virtual)

new NewlecExam객체 : 16바이트 +4바이트(virtual)

자바는 데이터공간 외에 4바이트를 더 갖는데. 그 4바이트는 메서드의 위치를 가리킨다.

객체가가진 앞머리를 통해 virtual 테이블에있는 주소로 가게된다.

Exam이 전달되면 앞머리(4바이트)를 통해 초록색 total 주소 로 가게되고

NewlecExam이 전달되면 앞머리(4바이트)를 통해 오렌지total주소로 가게된다.

전달되는 객체에따라 전달되는것이 다르다.


자료형을 자신의 개체보다 부모개체로 하면 다양한 객체를 넘겨 받을 수 있다.

print(B b)일경우
B로 참조를 한정할경우
b에 new C, new D를 전달할수없다.
B로 한정해버리면 다양한 객체를 넘겨받을 수 없게된다.

부모자료형으로  쓰면 넘겨받은 객체의 범위가 넓어진다.

super의 범위 (this 전체, super는 A~B)

A라는 클래스는 여러 자식을 갖을 수 있다.

자식C, B, D는 A부모형을 참조할 수 있다.

자식객체는 자기 개체를 참조할 수있고, 부모개체를 참조할 수있다.

A a = new C();

C가 아무것도 구현하지않았어도 A의기능을 구현할 수있다.

C가 f()를 재정의하면 f는 C의것이다.

A a = new C();

a.f()일지라도 C의 것이 호출된다. 

My2Frame가 repaint()를 오버라이드함


다음 수업순서 :

  • 자바 객체지향 → 서블릿(Back End) 오라클 Restful API JSP
  •                    →자바스크립트 AJAX (DOM:event) 화면갱신 HTML5 API
  • CSS PC페이지 모바일viewpoint  
  • 모바일 고정길이 dp(안드로이드) / pt(iso)

 

객체지향

  • 캡슐=개체 ->실체:객체
  • 객체들로 이루어진 프로그래밍
  • [A]->[B] : BA의 멤버 또는 부품으로 사용될 경우 : has a (상속)관계
  • [A]->[B] : BA의 부모 또는 틀,기반,기저,뼈대(프레임)으로 사용될 경우 : Is a (상속)관계
  • Is a 상속: (A extends B) 자식클래스에서 멤버를 추가하거나 기존에있는 부모의 함수를 수정
  • 부모의 멤버메소드를 수정하는 새로운 메소드를  오버라이드 메소드라고한다.
  • 오버라이드 : 자식우선권, 부모함수 덮어쓰기(자식이 부모랑 똑같은 함수를 가지고 있어서 부모것이가려진다)
  • 오버로드 : 기존메소드 + 동일한이름 + 파라미터 (즉, 이름동일한 메소드 공존가능)
  • 생성자? 객체초기화. 생성자간 호출 : this()

오버로드란 ?

과적된 상태, 기존함수에서 인자가 확장된것

기존애+동일한이름 +파라미터

인자가 추가되어 개별함수가 된다. total() 과 total(int ext)는 개별함수

함수구별하는 식별단위가 인자까지추가되었다(함수지향:함수이름으로만식별)

인자가 달라지면 다른함수로 인식된다.

오버로딩 후 Exam에서 생성자 두개를 선택할 수있다.

인자를 받는 생성자만 받도록 설정한 경우?

 

Frame클래스를 상속하고 오버라이딩

Frame을 오버라이딩하기위해 MyFrame으로 바꾸고 새로운클래스를 생성한다.

Frame을 상속한다

밖에서는 MyFrame의 기능처럼보인다.

원하는것으로  빠르게 만들어 쓸 수 있게된다.

Frame안에있는 paint함수를 오버라이드한것

 

Exam exam = new NewExam(); / 자식이 부모를 참조하다.

NewExam이 Exam, NewExam 둘다 가지고있어서 둘다 참조할 수 있다.

class A {

  int a ; //각 4바이트

  int b ;

}

class B extends A{

  int c;

}

B b = new B(); //총 12바이트가 만들어진다. 

자식부모를 가지고있어서 부모를 참조할 수 있다.

A b = new B();

오버로드가 계속 생기면 오버로드숫자만큼 코드가 중복된 것

코드중복이 발생→수정사항이 생기면 중복된 갯수만큼 고쳐야한다.→하나로 합치는 작업이 필요

둘중 하나는 없애고, 한쪽에서 다른 Exam()을 이용하도록한다.

위의 Exam()이 없어진다. 밑의 Exam()가 위의 Exam()일을 할 수 있다.

초기화 and 초기화

위에서는 호출만

밑에서는구현

오버로드는 코드중복->중복값갖고있는애들이 호출을 하게한다.

this(10,10,10)가  Exam(int a,..)을 호출한다.

초기화는 자식부터, 자식생성자 끝에서 부모생성자호출

Q. 어제수업 기본생성자를 자동으로 호출해서 super() 가 생략.

오늘은 디스를 써서 오버로드된 생성자호출.그럼 super()는 호출이 안됨 ?

 : 안된다.

super()는 this이후에 호출된다.

NewExam() → this(1) NewExam(int value) super(value) com=10;

객체생성은 부모것이만들어지고 자식객체가 만들어지지만, 초기화는 자식부터 초기화된다.

This(1)가 끝난이후에 super()가 호출된다

매개변수가 있는 super(value)를 명시해서 매개변수있는 부모생성자를 호출하도록했다.

super(value)를 쓰지않았다면 묵시적으로 super()가 호출된다. 

 

생성자는 최초로 한번만 호출되어야하는데, 내가 초기화하려는게 매개변수하나있는거니까 부모생성자도 super(value) 로 명시했다. 이걸적지않앗다면 컴파일러가 기본생성자로 초기화 했을것

3/30 수업정리

더보기

데이터 구조화
절차의 구조화

구조화된 프로그래밍에서의 캡슐화
데이터+함수 : 

캡슐 -> 시각의 전환 -> 객체지향->실세계를 반영하는 프로그래밍
->인간의 표현방법을 그대로 코드로 이어질 수 있게하는

적기가 움직, 적기의 발사

캡슐화 : 역할자(기능)

로또/콘솔
Lotto[gen()/..] / LottoConsole[print()]
제품 has a 부품 : 관계

Summary

  • A has a B 상속관계 : A제품을 만들때 B를 부품으로 사용
  • A is a B 상속관계 : A제품을 만들때 B를 틀로 사용 (extends , override)
  • Override : 부모의 함수명을 동일하게 써야한다. 우선순위가 높아진다.부모것을 확장해쓴다.
  • 상속 : 자식객체생성시 부모객체생성도 자동호출된다 (super(); )
  • 부모를 가지는 클래스는 두개의 객체를 생성한다.
  • 인스턴스함수: 객체를 넘겨받는 함수, 객체함수, 객체를 통해 호출, ex:생성자();
  • print메소드는 콘솔출력을 위한것→Lotto클래스안에 포함할 수있지만 콘솔출력용이 되버린다.→재사용률을높이고,결합도를 낮추기 위해 분리시킴.

Frame frame = new Frame();

Frame 클래스를 이용해 타이틀바와 사이즈조절이되는 윈도우를 만들수 있다.

Is A 상속관계

Is a : 기존 엔진을 틀로서 가져다가 고쳐서 이용. (ex,타이어가 타이어를 이용)

public class Lotto2 extends Lotto

Lotto라는 프레임으로 부터 물려받는 기능을 고쳐서 사용하다.

Lotto2에는 아무것도없었지만, lotto를 extends하면 (import 하기)

Lotto2의 객체를 통해 Lotto안에있는 gen()을 호출할 수 있다.

 

lotto안에있는 gen()호출
Lotto안의 gen실행후 출력

밖에서 봤을땐(main함수입장) Lotto2가 구현한 것 처럼 보인다. 

Lotto와 Lotto2를 같은것으로 인식한다.

Override

기존의 Lotto안에있는 gen()를 고쳐쓰다.

자식클래스의 메소드가 우선순위가 높아진다.

Lotto2가 gen()을 오버라이딩후 바뀐내역으로 출력 


캡슐화

Exam이 단순히 데이터를 구조화하고있을뿐 아니라, 총점과 평균을 구현하는 서비스까지 포함한다.

시험성적관리하는 역할을 부여

NewExam클래스를 만들고 Exam클래스를 extends 한다. 

Exam을 상속받을 NewExam클래스만들기

Exam클래스 / NewExam클래스

부모 / 자식

상위/하위

기반/파생

자바에서는 부모객체를 super라고 부른다.

this 는 자식객체를 호칭.

NewExam클래스에 total()이 없는데, total이 출력되는 이유 ? 

Exam()생성자가 자동호출되었기때문에 합계가 30이 나온다.

NewExam클래스는 com을 초기화하는 생성자만 갖고있다.
Exam()의 생성자를 자동으로 호출했기때문에 가능한것

Exam클래스의 생성자안의 kor,eng,math는 this의 kor, this의 eng, this의 math가 초기화 된것이다. this생략.

 

부모를 가지는 클래스는 두개의 객체를 생성한다.

New NewExam()을 호출하는 순간 Super()생성자가 자동으로 호출된다.

super()생성자가 적용이 안되었다면 Exam()생성자에서 초기화된부분이 반영이 되지않았어야한다.

total :30출력된것은 자식클래스 객체생성과 동시에 부모클래스객체 생성도 자동반영되었기 때문이다.

  • super();가 생략되었지만, 명시해줘도된다. 명시할때 무조건 가장먼저 호출되어야한다.
  • 생성자는 한번만호출 되고, 제일먼저 호출되어야하기 때문이다.

NewExam클래스에서 total()를 오버라이딩한다면 ? 

NewExam클래스에서 ctrl + space를 누르면 오버라이딩할 수 있는 부모의 함수들이 뜬다.

total()선택. return 값에 부모의 total() + com; 더해준다.

부모의 total()에 com 더해줬다.

 


오버라이딩한 total()에서  super를 지운다면 ?

super생략불가

super를 지우면, this가붙게된다.현재 객체가 가지고있는 total()를 찾게된다.

자신이 자신을 부르게된다. 내가 부모를 부르기위해 super를 써야한다.

 

super를 지우고 실행했을경우

내가 나를호출한다.


생성자도 인자값을 받을 수 있다.

인자를 갖고있지않다면 기본값이된다.

인자를 통해서 내가 원하는 값으로 바꿀수도있다.

객체지향 프로그래밍 : 객체를 중심으로 하는 프로그래밍
객체를 프로그램을 구성하는 기본단위로 본다.


객체에게 함수는 어떤 존재인가요 ?
기능,서비스로서의 존재이다.
서비스를 구현할 때  함수의 원래 목적인 나누기, 집중화, 재사용

객체-역할자-기능/서비스

class 상점관리{
   private 점원 점원1;
   private  손님 손님1;

}

  • 구조적함수 : 데이터구조에 영향을 받는것모아둔것
  • 객체지향:객체의 행위를 모아둔것, 좀더 큰단위의 함수들
                 public 외부로노출해야할 객체행위
                 private 반복,중첩,내부적으로 쓸 구조적방식함수
                과거 구조적프로그래밍  + 함수를 묶는개념
                선택적으로 만든다.
                분석,기획-객체찾게되고  서비스를찾음-서비스를 구조화시킴-함수를 구현(절차작성)-API
  • 객체지향적 관점 :~를 담당하는 것으로 볼것. 역할자로보는것 : 캡슐화, 클래스,객체
  • Has A상속 : 다른객체를 가지고 자기를 구현

자바실습 정리: 

출력역할을 위한 캡슐을 만들자 ->lotto가 필요하다
그래서 lotto를 가지게된다
this가 lotto를 가진다. has a
생성은 외부에서, 또는 자기스스로 하는게있다, (composition, association)


 

 



포함관계: 부품관계 has관계
객체로 객체단위로 나누기,집중화,재사용가능
나누기 : has
집중화 : is a
재사용 둘 다 가능

 

[객체지향] 프로그래밍
:  프로그램 => 코딩(절차를 다루는 부분) 
+ (절차를 나누고 정리하는 부분) : 구조적인 방법 / 객체지향적인 방법
구조적인 방법과 객체지향 방법은 절차를 나누고 정리하는 방법에서 어떤 차이가 있는가

 

절차만드는것 : 배열까지 배운것들

절차를나누고, 정리하는것은 사용자에게 보이지않는 부분이다.


절차를 나누는 방법(함수를 나누는 기준은)에서의 차이는?
-구조적인 방법에서는
   크기나 중첩/복잡도 높아지는 부분에서 코드를 나누었다.
    (IBM에서는 3년차 코딩 경험을 50라인 정도 ...)
   재사용/반복(집중화)/난이도 높아/...

   내가 감당할 수 있는정도가 기준이었다->애매함

    코드를 잘게 쪼갠다. 복잡하면 나눈것

-객체지향 방법에서는
   객체가 서비스하는 단위(실세계에서 객체의 행위)가 추가됨. //함수를 나누는 방법이 늘어남

   고객이 주문한다 - 주문하는 행위를 서비스로 만듦.
   주문을 order() -> 100줄 .. 중첩/반복/난이도..

    구조적인방법에서달라진게아니라 얹어진 것. 더큰개념의의 함수

(함수를)정리하는 방법에서의 차이는?
-구조적인 방법에서는
  데이터구조가 사용되면 함수가 외부의 코드로부터 영향을 받는 이상현상이 발생한다.
  따라서 데이터 구조를 사용하는 함수들을 하나로 묶어야 하는 필요성이 생기는데...
  
-객체지향 방법에서는
  객체라는 실세계에 반영함으로써 캡슐화된 함수를 그 객체의 행위로 보는 방식으로
  정리를 하자.   

  잘게 쪼개는 볼룸/중첩을 없애는 함수들은? -> 마찬가지로 캡슐화가 되어 있어야 한다.
 


분석/기획 -> 객체/서비스->구조적으로->함수를 구현(절차)/코딩 : API == 플랫폼

                          방정리                          구동      

 

자바언어가 물리적으로 사용하는 장치는 ?

컴퓨터 
 -CPU : 프로그래밍 언어 : 연산자/제어구조
 -주기억장치 : 프로그래밍 언어 : 변수/배열

캡슐화/함수/구조화/          ->   컴파일러 -> 절차(API 플랫폼을 사용)

(컴파일러가 제공해주는기능)


 -입/출력 : API == 플랫폼 (API는 플랫폼을 사용하기위한 도구.언어에따라 달라진다)

 

플랫폼        : API (플랫폼을 직접쓰는게아니라 API이용한다.)
그래픽 카드 : Win32API/AWT/Direct/OpenGL (그래픽을 다뤘을때 사용한 플랫폼)
카카오 친구 : 카카오 API (데이터를 이용하는 플랫폼이 카카오)

 

자바에서 클래스의 용도

1. 데이터를 구조화하는 용도(방정리)

   (사원/학생/교사) ~의 이름, ~의 주소, 나이, 연락처

    사원(이름/나이/주소/..), 학생, 교사

    사원 hailey = new 사원();

    울타리(유형) 안의 속성을 묶음, 거시적으로 데이터관리

    

2. 캡슐화를 위한 용도

   서비스를 묶는 역할

   캡슐은 역할자고 그 역할자가 가지는 기능(서비스)에 초점을 맞추는 방식

   데이터 속성은 가리고, 기능만 노출, 캡슐을 역할자로 본다. 객체화

    


LottoConsole.print(lotto);

객체를 생성하지않음 함수위주 코드.

실존하는 객체를 만들지않았다 = 개체가 아니다.

LottoConsole은 print함수가 있는 위치정보. 함수지향

LottoConsole은 객체화되지않았다. 함수를 가지고있는 울타리일뿐이다.

 

매개변수로 lotto를 받고있다.

print()안의 lotto들도 Program클래스에서 인자로 받은 lotto이다. 

 

 

public static void print(Lotto lotto) 인스턴스메소드로 , 역할자개념

로또출력을 위한 객체를 만들자.

 

인스턴스메소드로 바꾸기

static 지우기, 매개변수 사라짐

static함수                                    /                                              인스턴스메소드

 

LottoConsole.print(lotto);

LottoConsole는 print함수의 위치정보만 나타낸다. print함수가 있는 울타리.개체가아니다.함수지향

함수만있고 역할자는 없음, lotto를 인자로 넘겨받아서 출력

 

LottoConsole console = new LottoConsole(lotto);

console.print();

lotto를 이용해서 출력을 담당하는 객체, 출력해주는 역할자(객체)를 만듦, 객체지향

역할로 바라보는것

 

new Lotto와 new LottoConsole의 차이 (두 개체의 차이) 

Lotto로또 번호를 관리하는 역할, 객체지향적으로 봐야함

LottoConsole 로또번호를 출력하는 역할 ~를 담당하는 것으로 볼것.

Lotto : 다른 객체를 가지고있지않고 스스로 gen(), sort()기능을 가진 캡슐, 로또번호를 관리하는 역할

LottoConsole : 로또번호를 출력하는 역할. Lotto를 부품으로 가지고있다. 다른객체를 재이용

                    Has a 상속, 다른객체를 부품으로 이용

                    lotto의 기능을 직접구현할 필요없이 물려받아서 구현한다.

 

멤버변수가아니라 상속이아님


상속

물려받다보다는 제공받다로 이해할것

능력,기능을 제공받다. 능력,기능을 가진 객체를 has한다

Composition has A 상속 : 일체형

생성될때 Lotto()같이만들어지고 , LottoConsole이 사라지면 Lotto()같이 사라진다.

생명주기가 일치한다.

일체형
일체형 Composition has A 상속

 


Association has A 상속 (분리형)

 

배터리를 꽂아서 쓰는것처럼, 이용할때만 사용

분리형 Association has A 상속

 


print()메소드의 매개변수로 Lotto lotto를 넣는다면 ?

private Lotto lotto 선언할 필요가 없어진다. this객체의 구성으로 넣어서 부품으로쓰려고한것

 

캡슐인 객체와 기본형데이터의 차이

캡슐은 다양한 서비스를 가지고있어서 this가 가지고있는 lotto의 gen()기능을 불러올 수있다.

 

+ Recent posts