반응형

pythondir해서 바로 할 수 가 없다.

그래서 document 를 계속 켜야 한다.

java는 유지보수는 편하지만 왔다갔다 하면 좀 번거롭다.

test는 로직이 문제 있는지 확인하는 것이다.

최근에는 TDD사용해서

녹색은 public이다.

빨간색은 private

s붙으면 static

s안 붙으면 class가 못 쓴다.

녹색 못 써서 인스턴스 만들어야 한다.

인스턴스 만든 후 생성자 불러야 한다. new해서

매개변수 있는 것인지 없는 것인지

생성자 괄호안에 아무것도 없으면 매개변수가 없어서 매개변수 없이 호출 가능

 

**만들어진 클래스 이용

1.내가 원하는 기능을 가진 클래스를 찾기

python에서 회귀 분석시 누가 해주는 것을 찾아야 한다. 없으면 새로 만들어야 한다.

 

2.내가 원하는 기능을 수행해주는 메소드를 찾기

=>static인지 아닌지 확인 :static 이라면 instance를 생성할 필요가 없음

static이 아니라면 instance를 생성해야 하므로 항상 생성자를 다시 확인

javastatic이면 s가 보인다.

pythonstatic이면 self가 없다.

 

=>메소드의 매개변수를 확인

매개변수는 메소드에게 일을 시킬 때 메소드가 사용할 데이터입니다.

필요한 데이터를 제공하지 않으면 메소드는 일을 하지 않거나 에러를 발생

 

java에서 합계 구할 경우

매개변수는 list tuple set  => 가 가능하다.

sum을 구할 때 여러개 주기는 번거러워서 그래서 대표하는 것을 쓴다.

반복자 iterable

int ... =>int몇재줘도 괜찮아요

double  실수

string 문자

 

=>return type을 확인

작업을 수행하고 어떤 결과를 돌려주는지 확인

void는 안주는 것이다.다른것은 나한테 주는 것이다.

 

자료형을 먼저 배우는 이유가  매개변수와 , return 등을 배워야 한다.

매개변수를 만들 줄 알아야 메소드를 사용할 수 있기 때문이다.

tupledict를 잘 봐야 한다.

list tuple 수정할 수 있는지 않는지

분석의 결과는 tuple로 주는게 낳다.

list는 번호

dict는 이름으로 =>java에서는 map이다.

cconstructor

 

 

cpu빨라서 느린 것과 싱크 맞추기 업렵다.

 

키보드 입력

파일 출력(쓰기)

네트워크 출력(쓰기)

싱크를 맞추기 위해서는 모아서 해야 하기 때문에 버퍼를 만들었다.

 

프린터도 같은 기능이다. 버퍼크기

버퍼(임시기억 장치)

속도빠른 것과 늦은 것이 일 할때 임시기억 장치에 모아놓고 flush되면 작업한다.

버퍼 내용을 비워서 CPU가는 것 flush라고 한다.

nextInt (정수 부분만 읽기)

nextLine(enter까지 읽는 것)

 

nextInt  버퍼에서 정수부분만 cpu에 읽는 것

정수 입력 받다. nextInt()

문자열 입력 nextLine()

키보드 입력

=>123 enter

=>안녕 enter

 

123      nextInt()

enter   nextLine()

안녕     nextLine()

 

 

nextLine() enter만날때 까지 한다.그래서 안녕이 아닌 enter만 가져갈 경우가 높다.

nextLine() -> 안녕 가져온다.

이것 해결 방법

1). nextLine()한번 더 써주면 된다.(java)

2). nextInt()입력 끝나고 비우고 다시수행 버퍼 비울수 있는 언어는 c언어 밖에 없다.

운영체제가 c90%이기때문에 cfflush()를 입력하면 된다. 이러면 정수 ,enter눌리는 것을 해결할 수 있다.enter밖에 입력안되는 경우를 해결가능하다.

javajvm바꿔서 전달하기 때문에 java는 운영체제 명령어를 호출 할 수 없다.

 

 

채팅할 경우

버퍼에 내용을 써 놓다가 한번에 보이는 것이 낫다.

write, print기는은 보내는 명령이 아니고 버퍼에 기록하는 명령어이다.

chatting->print는 출력이 아니고 버퍼에 기록한다.

버퍼에 내용 쓰주세요 -> flusn() ->다른 분 한테 보여주게 하는 것

채팅 잘되는 것은 프로그램 종료하면 버퍼의 내용에 쓰준다. 프로그램 종료됨녀서 버퍼의 내용을 비워준다.

: 이사짐

B에서 WRITE,PRINT하는 것은 이사가 아니여서 FLUSH를 해줘야 A까지 가서 끝난다.

상대방에 기록이 안되고 메세지가 안넘어가면 FLUSH하면 된다.FLUSH안해줘서 그렇기 때문이다.

 

=

 

 

 

cpu ram사이에 메인보드로 연결한다.

메인보드로 연결하는 것은 연결하는 것이만 속도차이가 있어서 이 문제를 해결한다.

 

 

 

GOOGLE ANALYTICS

이상탐지

거래패턴

데이터를 가지고 있어야 하고 패턴을 가져고 있어야 한다.

 

 

 

 

nextInt()

nextLine()

이렇게 될경우만

sc.nextLine()

만해주면 된다.

 

 

프로그램 끝다 크면 내용이 없어진다. 변수처리 이기 때문이다.

데이터가 없을경우

 

 

현재 게시글이 없습니다.

 

 

 

 

**package &import

1.package

=>관련있는 클래스의 모임

=>파일 시스템에서는 하나의 디렉토리

=>package가 배포 단위

=>클래스는 실행은 가능하지만 배포를 할 수 없습니ㅏㄷ.

=>자바에서는 클래스들을 다른 프로젝트에서 사용하도록 배포하고자 할 떄는 클래스들을 패키지로 묶어서 jar로 압축해서 전달하면 됩니다.

기본적으로 패키지 단위로 가능하다.

 

 

2.자바의 클래스 로드

=>자바는 실행되는 프로그램에 존재하는 모든 클래스들을 jvm(java virtual machine)에 로드하고 실행

=>자바에서는 존재하는 모든 클래스를 별도의 작업없이 바로 사용이 가능

=>사용을 할 때는 클래스의 전체 경로를 입력해야 합니다.

패키지이름.클래스의 형태로 사용해야 합니다.

 

 

3.import

=>import는 가져오는 개념이 아니고 줄여쓰기 위한 개념입니다.

=>클래스를 만들기 전 상단 부분에 import를 해주면 패키지이름을 생략하고 클래스를 사용할 수 있습니다.

1)패키지이름.*

=>패키지에 존재하는 모든 클래스들을 패키지 이름을 생략하고 사용가능

 

2)패키지이름.클래스이름

=>클래스이름에 해당하는 클래스만 패키지 이름을 생략하고 사용가능

 

3)ex

Scanner의 원래 이름은 java.util.Scanner

java.util.Scanner sc = new java.util.Scanner(System.in);

 

=>위처럼 작성하면 너무 길어서 import하고 사용

import java.util.Scanner;

Scanner sc = new Scanner(System.in);

 

=>Eclipse에서는 클래스 이름만 사용한 경우 클래스 이름에 커서를 갖다대면 import해주겠다는 매시지가 보여고 이름 클릭하면 자동으로 import구문이 입력됩니다.

 

주의 할 점이 2가지가 있다.

import java.util.Scanner;

import는 가져오는 개념이 아니다.

 

4)import할 때 주의 할 점

=>클래스를 찾을 때 자바는 현재 프로젝트에서 찾고 없으면 다른 패키지에서 찾습니다.

제공되는 클래스와 동일한 이름의 클래스를 만들면 제공되는 클래스를 사용할 때는 패키지이름을 전부 입력해서 사용해야 합니다.

제공되는 클래스와 동일한 이름의 클래스를 만들지 않는 것이 좋습니다.

 

=>서로 다른 패키지에 동일한 이름의 클래스가 존재한는 경우가 있는데 프로젝트 내에서 2개의 클래스를 모두 사용할 때는 하나는 패키지이름을 전부 입력하는 것이 좋습니다.

java.util.Datejava.sql.Date의 경우 모두 사용하는 경우에 하나는 전체 경로를 입력하는 것이 좋습니다.

 

5)java application을 개발 할 때 import하지 않아도 java.lang패키지는 이미 import가 되어 있어서 클래스 이름만 사용하면 됩니다.

 

c#은 자바가 바로 된다. unity c #

.net

c# ->visual c#(microsoft windows에 돌아가게끔)

c++visual c++

병원 c#, visual c# ->window 테블릿

 

 

c ,python, javascript

python는 파일 단위로 실행

python 모듈

pytho는 다양한 방식으로 import가 가능하다.

a.py --------->파일 단위로 동작한다.

b.py파일을 사용하려면 import b이다.

그러면 b.py를 메모리에 올라간다.

그럼 c.pyb.py import하지 않아도 사용가능하다.

하지만 a.py가 실행해야 한다.

a.py 실행하지 않으면 c.py가 사용불가하다.

pythonimport하면 메도리에  존재된다.

cjavascriptimport include

소스를 포함하는 개념 내 파일에 저장한다.

a.c  #inlcude b.c 하면 b.c에 있는 코드가 a.c에 복사된다.

a.c에서 b.c사용가능하다.

여러번하면 안된다. 에러난다. 이름이 똑 같은것 생기기 깨문이다. 중복명명은 안된다.

c.c에서는 사용불가 하다. 메모리가 아니라 코드이기 때문에

python에서는 여러번 import가능하다.

 

java

jvm

 

 

 

 

 

 

 

클래스를 만들면 jvm에 들어간다. 만들어지면 아무것이나 쓸수 있다. 메모리 적재하고 include필요없다.

그냥 쓰려면 이름이 길다.java.util.Scanner

import java.util.* 이렇게 하면 사용하기 편하다.

자바에서는 import안해도 되는데 패키지이름을 다 적어야 한다.

c, python 는 필요할 때 메모리에 적재한ㄷ.(느리다.)

java는 다 올리고 해서 서버에 좋다. (빨리한다.)

      요청할때 빨리 처리한다 . 그래서 은행 등에서 많이사용한다.

프로그램언어는 상호 보완적인 것이다.

필요할때 메모리에 적재하면  ->client

javascript 믄법 안엔느 다른 서버용으로 만든다.

은행은 java , c#올려놓고 해야 한다.

visual c# -> java c#보다 기능이 안될 수도 있다.

c#   java -> scala, kotlin , .....

 

 

상속(Inheritance):

class Tank{

           //필요한 속성이나 메소드를 만들었다.

           private int offence;

           private int deffence;

           ..........

           public void siz(){

                      

           }

}

 

class Marin{

           private int power;

           private int health;//체력

           ..........

public void shot(){
}

}

 

이 두가지는 공통된 속성이 있다.

방어력 관련 수정하고 싶을 때 이름이 다르고 하면 하나하나씩 수정해야 한다.

유사한 기능은 이름을 같게 한다. 맘데로 만들지 말고

healthdeffence로 바꾸고 등 해야 하기 때문에

똑 같은 것을 상속이 가능하면

class Unit{

           protected int power;

           protected int health;

}

 

class Tank extends Unit{

           public void siz(){

                      

           }

}

class Marin extends Unit {

public void shot(){
}

}

Unit에서 바꾸면된다.

Unit상위 클래스

Tank, Marin은 하위 class이다.

절대로 부모와 자식을 하면 안된다.왜냐하면 Tank, Marin을 먼저 만들고 Unit을 만든다.

하위클래스가 상위클래스의 모든 것을 물려받는다.

프로그램에서는 :

 

 

 

 

 

 

 

 

 

상위 클래스 파악해서 제공하는 것이  Framework(필요한것 만 먼저 제공하는 것이다.)

microsoft V ->Framework이다

c# 프로그램언어

visual c# window개발할 때 편하게 할려고 하는 것이다.-> framework

java spring

engine 자주 사용하는 것 미리 만들어서 제공

 

나한테 상위 클래스를 몇개 준것이다.

 

 

 

 

 

 

 

 

 

 

 

프레임워크로 하면 가져와서 쉽게 쉽게 사용할 수 있다.

자바를 못해도 자바웹프로그래밍을 할 수 있다.

웹프로그래밍은 한번 가공한 것이다.

자바언어 ->쓰기 편리하게 가공한 것이 프래임웨크나 라이브러리 이다.

 

 

상속(Inheritance)과 구현(Implement)은 구분해야 한다.

클래스는 상속 (편하게 하기 위해서 )

인터페이스는 구현 - 프로토콜

interface는 메뉴판이라고 생각하면 된다.

모형만 보고 있는 지 없는지 판단하는 것이 interface라고 한다.

 

 

공격성공률(); head파일

 

공격성공률() {내용}.c =>구현 만들어주는 과정이 구현이다. interface

자바는 다중상속을 지원하지 않는다.

 

 

**상속(Inheritance)

1.개념

=>하위 클래스가 상위 클래스의 모든 것을 물려받는 것

=>물려받는 클래스를 하위(Sub) 클래스라고 하는데 다른 용어로는 Derived(파생 클래스)클래스라고도 하고 물려주는 클래스를 상위(Super)클래스라고 하는데 다른 용어로는 Based(기반 클래스) 클래스라고도 합니다.

 

=>자주 사용하는 상위 클래스들을 파악해서 프로그램을 만들기 쉽게 제공해주는 것을 프레임워크 또는 젠인이라고 부릅니다.

 

원도우 용 프로그램 개발 프레임워크로 가장 유명한 것인 VC#,VC++(MFC)

Java개발 프레임워크로 유명한 것은 Spring

 

2.상속을 이용했을 때의 장점

=>코드를 간결하게 만들수 있기 때문에 유지보수가 편리해집니다.(upgare편리하다.)

 

=>재사용이 증가

 

3.단점

=>상위 클래스의 내용을 변경하면 하위 클래스도 영향을 받게됩니다.

하위 클래스는 상위 클래스에 종속됩니다.

 

 

4.상속을 관계로 표현할 떄는 is a관계라고 합니다.

 

5.java는 단일 상속만 지원합니다.

java의 모든 클래스는 하나의 클래스로부터만 상속을 받을 수 있습니다.

 

6.java의 모든 클래스는 java.lang.Object라는 클래스로부터 상속을 받습니다.

 

7.java에서 상속 방법

class 클래스이름 extends 상위클래스이름{

 

}

 

8.접근지정자와 상속

private: 상속은 되지만 하위 클래스에서 접근할 수 없음(사용 불가)

default(package):동일한 패키지내에서는 하위 클래스에서 상위 클래스의 멤버를 사용할 수 있고 서로 다른 패키지에서는 사용이 불가능

protected:하위 클래스에서 사용가능

public: 하위 클래스에서 사용 가능하고 인스턴스도 사용 가능

 

 

 

9.상속과 접근 지정자

1)상위 클래스로 사용할 Based클래스

 

public class Based {

          

          

           private int num;

                       String title;//접근 지정자를 설정하니 않는 것을 default 또는 package

           protected String content;

           public int readCnt;

          

}

 

2).Based 클래스로 부터 상속받은 Derived 클래스

//Based 클래스를 상속받은 Derived클래스

public class Derived extends Based {

 

}

           public void disp() {

                       //num = 10;//num private 멤버라서 보이지 않는다고 에러메시지

                       //protected로 변경할 것인지 물어봅니다.

                      

                       title = "";

                       content ="내용";

                       readCnt = 0;

                      

           }

num은 빨간색이다. private

readCnt 는 녹색이다. public

 

=>상속을 받을 때는 클래스를 만들 때 super class에 입력해도 되고 클래스를 만든 후 직접 extends상위 클래스 이름을 입력해도 됩니다.

 

 

10.super

1)인스턴스 메소드에서의 super

=>인스턴스 메소드 안에서 어떤 이름을 사용하면 메소드 안에서 먼저 찾고 없으면 메소드 외부에서 찾으면 그래도 없으면 상위 클래스에서 이름을 찾습니다.

상위 클래스에도 없으면 undefined 되었다고 에러메시지 출력

 

=>메소드 안에서 찾지 않고 메소드 외부에서 부터 찾고자 할 때는 this.을 앞에 붙이면 됩니다.

this가 붙으면 메소드 안에서는 찾지 않고 메소드 외부의 클래스에서 먼저 찾고 없으면 상위 클래스에서 찾습니다.

 

=>this.대신에 super.을 붙이면 자신의 클래스에서도 찾지 않고 상위 클래스에서만 찾습니다.

 

=>this를 사용해야만 하는 경우는 메소드 내에 만든 변수와 클래스에 만들어진 변수 이름이 같을 때 클래스에 만들어진 변수를 사용할 때 이용

super는 현재 클래스와 상위 클래스에 동일한 이름의 메소드가 있을 때 상위 클래스의 메소드를 호출하기 위해서 사용합니다.

 

 

실습

=>Based클래스에 print()메소드를 생성

           public void print() {

                       System.out.println("상위 클래스의 print");

           }

 

=> Derived 클래스에 print()메소드를 생성

           public void print() {

                       System.out.println("하위 클래스의 print");

           }

          

           public void method() {

                       print();//앞에 아무것도 붙지 않았기 때문에 자신의 클래스에서부터 찾아 갑니다.

                       //자신의 클래스에 만든 print()

                      System.out.println("=======================");

                      

                       super.print();//상위 클래스에서 print()를 찾습니다.

                       //Based에 만든   print()

           }

 

=>main메소드를 소유한 실행 클래스를 만들어서 Derived 클래스의 method()호출

이것을 호출할려면 메인이나 테스트가 있어야 한다.

public class Main {

 

           public static void main(String[] args) {

                       //Derived 클래스의 method()를 호출

                      

                       //Derived인스턴스를 생성

                       Derived d = new Derived();

                       //메소드 호출 -void

                       //void가 아니면 저장하면 된다.

                       d.method();

 

           }

 

}

상위것 호출하고 싶으면 super. 사용하면 된다.

첫번째 super는 인스턴스 앞에서 쓰는 것이고

 

2)생성자에서의 super()

=>생성자에 첫번째 줄은 작성을 하지 않더라도 무조건 super()입니다.

상위 클래스의 매개변수가 없는 생성자를 호출하는 구문입니다.

 

=>Based클래스를 상속받은 Derived클래스에 생성자를 만들지 않더라도 아래와 같은 생성자가 존재

public Derived(){

           super();//이 구문은 new Based();와 동일한 구문

}

 

=>Based에 생성자를 만들고 super()를 호출하지 않으면 자동으로 super()가 삽입됩니다.

 

=>상속을 받으면 상위 클래스의 모든 멤버를 상속받아서 생성해야 합니다.

상위 클래스의 멤버를 생성할려면 상위 클래스의 생성자를 호출해야 합니다.

코드 상 호출하지 않더라도 무조건 해야 하기 때문에 자바에서는 자동으로 삽입해줍니다.

 

=>상위 클래스에 매개변수가 없는 생성자(default constructor)가 없으면 하위 클래스에 생성자를 만들어서 상위클래스의 생성자를 직접 호출해야 합니다.

생성자 만들지 않으면 상위 클래스를 안 만들었다.

Based가 우리 것 아니면 손을 못데기 때문에 하위 클래스에서 해결해야 한다.

           //상위 클래스에 default constructor가 없는 경우에는 생성자를 만들고  super를 이용해서

           //상위 클래스의 생성자를 호출해야 합니다.

           //중요한 문제이다.

           //프레임워크를 사용하면 상위 클래스를 우리가 수정할 수 없기 때문에

           //하위 클래스에서 해결을 해야 합니다.

           //이런식의 코드가 Andriod Studio 에서 많이 사용됩니다.

           //Andriod Studio(Andriod Native App개발을 위한 JAVA FRAMEWORK)에서 많이 사용됩니다.

           public Derived() {

                       //new Based(10) 과 동일한 코드

                       super(10);

           }

 

 

 

11.polymorphism(다형성)

1)method overriding(메소드 재정의)

=>사위 클래스에 존재하는 메소드를 하위 클래스에서 다시 만드는 것

=>메소드 이름이 같고 매개변수의 개수와 자료형이 같은 메소드를 다시 만드는 것

=>매개변수의 개수나 자료형이 다르면 method overloading(메소드 중복정의)

=>하는 이유는 자신이 만든 클래스의 경우는 다형성 구현을 위해서 이고 프레임워크가 제공하는 클래스가 상위 클래스인 경우는 기능확장을 위해서 입니다.

Based.java

           public void print() {

                       System.out.println("상위 클래스의 print");

           }

 

public class Derived extends Based {

           //상위 클래스에 print()가 존재하는데 하위 클래스에서 다시 만드는 것을 Method Overriding이라고 합니다.

           public void print() {

                       System.out.println("하위 클래스의 print");

           }

}

 

2)프레임워크가 제공하는 클래스를 상속받아서 사용하는 경우

=>프레임워크가 제공하는 클래스는 기본 기능만 제고하기 때문에 기본 기능을 확장하기 위해서 상속을 받아서 사용

=>기본 기능을 확장할 때 메소드 오버라이딩을 사용하는데 이 때 상위 클래스의 메소드를 호출을 해주어야 합니다.

Button클래스를 제공

-Button을 누르면 동작하는 click이라는 메소드를 제공

 

 

Button을 상속받는 ButtonEx라는 클래스를 생성

-버튼을 누르면 동작하는 메소드:click

 

public void method(){

           super.method()

           //추가하고자 하는 기능

}

 

=>상위 클래스의 메소드 호출 시점은 정리를 하는 메소드를 제외하고는 상위 클래스의 메소드를 먼저 호출해야 합니다.

정리하는 메소드는 상위 클래스의 메소드를 나중에 호출합니다.

=>andriod studio같은 경우에는 자신이 제공하는 클래스를 상속받아서 메소드를 호벌이딩 할 때 상위 클래스의 메소드를 호출하지 않으면 에러 발생하고 vc++같은 곳에서는 메소드 오버라이딩 할 떄 상위 클래스 메소드 호출하는 구문이 자동 삽입됩니다.

andoid super.method() 이것 안하면 오류 나고

mfc같은 경우에는 자동으로 만들어진다.

 

항상 하위 클래스는 상위 클래스의 것을 가지고 한다.

 

 

 

 

 

 

 

 

 

상위에 하는 것이다. 상위에 해야 한다. super()

상위를 만들고

소멸, 정리를 할 때는 하위 정리하고 상위 정리한다.

 

3)@override

@이 붙는 것은 자바에서는 annotation이라고 하고 python에서는 decorator라고 합니다.

어노테이션은 자주 사용하는 (반복적으로) 자바 코드를 매번 작성하는 것이 번거롭기 떄문에 이 어노테이션을 추가하면 자바가 컴파일을 할 때 자동으로 코드를 삽입해주는 것입니다.

python에서 static 메소드 작성하고 싶으면 @static메소드

               class 메소드 작성하고 싶으면 @class메소드

 

@Override는 이 메소드가 오버라이딩 된 메소드를 라는 것을 알려주기 위한 어노테이션

이 어노테이션을 붙였는데 이 메소드가 상위 클래스에 없으면 에러가 발생합니다.

 

 

 

 

 

프로그램의 가독성을 높이기 이해서 오버라이딩 한 경우에는 붙여주는 것이 좋습니다.

 

           //상위 클래스에 print()가 존재하는데 하위 클래스에서 다시 만드는 것을 Method Overriding이라고 합니다.

           @Override//이 메소드가 오버라이딩 된 메소드라는 것을 알아볼 수 있습니다.

           public void print() {

                       System.out.println("하위 클래스의 print");

           }

          

           public void method() {

                       print();//앞에 아무것도 붙지 않았기 때문에 자신의 클래스에서부터 찾아 갑니다.

                       //자신의 클래스에 만든 print()

                      System.out.println("=======================");

                      

                       super.print();//상위 클래스에서 print()를 찾습니다.

                       //Based에 만든   print()

           }

 

4)객체 지향 언어에서의 참조형 상이의 대입

=>cjava와 같은 정적 자료형 언어들은 변수를 선언할 때 사용한 자료형의 데이터만 변수에 대입할 수 있습니다.

 

int a =10;

//a에는 정수만 대입이 가능합니다.

 

=>참조형 에서는 한가지 예외가 있습니다.

상위 클래스 타입으로 만들어진 변수에 하위 클래스 타입의 인스턴스 첨조를 대입할 수 있습니다.

 

하위 클래스 타입으로 만들어진 변수에 상위 클래스 타입의 인스턴스 참조는 대입할 수 없는데 강제 형변환을 하면 대입이 되고 문법적인 에러는 없습니다.

원래의 자료형이 하위 클래스 타입이 아니면 실행할 때 예외가 발생합니다.

 

 

Based, Based를 상속받은 Derived가 존재

Based obj = new Based();//클래스 이름과 생성자 이름이 같았다.

//Based로 만든 변수에 Based 인스턴스를 대입 - 에러 없음

Derived ins = new Derived();//에러 없음

 

 

Based o = new Derived();//생성자이름 DerivedBased로 부터 상속을 받았기 때문에 가능

Derived d = new Based();//이 문장은 에러 BasedDerived의 하이 클래스가 아니어서 에러

위의 구조가 성립하기 위해서 강제 형 변환은 가능하다.

 

Derived d = (Derived)(new Based()); //강제 형 변환을 해서 에러는 아님 - 실행시 에러

이것은 new Based()으로 하는 것이다.

소나타를 사고 그래즈로 포장하는 것이다.

Derived d = (Derived)(o); //강제 형 번환을 해서 에러는 아님 - 실행 시 에러 아님

o Based로 만들은 것이고 DerivedBased=> new Derived()

그랜즈를 살려고 했는데 원래 그랜즈 였는데 포장을 소나타로 바꿨다.

 

객체 지향언어는 상속을 많이 사용한다.

 

 

Backgroud Colour

화면에 보여주는 것 같은 모든  GUI프로그램에서

addSubView(Button)

addSubView(Text)

50개 있으면 메소드 50개 만들어야 합니다.

보여주기 기능이기 때문에 아래것으로 바꾸면됩니다.

addSubView(View) ->Button, TextView

보여주기여쏘 특수한 기능이 필요없다.

 

 

c는 클래스의 개념이 없다.

객체 지향은 공통 된것은 상속받아서 사용한다.상속받아서 기능을 추가한다.

대표하는 것은 형변환을 안해도 가질 수 있다.

변수 -> instance

Based ->

derived ->그랜즈

 

 

5)참조형 변수의 멤버 호출

=>참조형 변수는 변수를 선언할 때 사용한 자료형의 멤버만 호출이 가능합니다.

Based o = new Derived();

oBased에 존재 하는 것만 호출할 수 있습니다.

Based에 없고 Derived에 만 존재하는 것은 호출할 수 없습니다.

 

=>예외적으로 overriding된 메소드는 인스턴스 만들 때 사용한 생성자의 것을 호출합니다.

o가 오버라이딩 된 메소드를 호출할 떄는 Based의 것이 호출되는 것이 아니고 Derived의 것이 호출됩니다.

 

Derivedprint()@override이다.@override있어도 없어도 결과는 같다.

 

6)overmorphism(다형성)

=>동일한 메시지에 대하여 다르게 반응하는 성질

=>동일한 코드가 대입된 인스턴스에 따라 다른 메소드를 호출하는 것(마우스의 클릭)

최악의 상황 클래스 이름이 다르는 것 할 수 없지만 공격을 만들기 위해서는 아래 3개 알아야 한다.

1).

 

class Z{

           public void 공격(){

                       System.out.println("저그의 공격");

           }

}

 

 2).

 

class T{

           public void attack(){

                       System.out.println("테란의 공격");

           }

}

 3).

 

class P{

           public void offence(){

                       System.out.println("프로세스의  공격");

           }

}

 

 

메인 공격함수 호출

 

class Main{

           public static void main(String[] args){

                       Z z = new Z();

                       z.공격();

                       T t = new T();

                       t.attack();

                       p p = new P();

                       p.offence();

           }

}

 

 

 

3개를 전부 attack으로 바꾼다.

1).

 

class Z{

           public void attack(){

                       System.out.println("저그의 공격");

           }

}

 

 

2).

 

class T{

           public void attack(){

                       System.out.println("테란의 공격");

           }

}

 

 

3).

 

class P{

           public void attack(){

                       System.out.println("프로세스의  공격");

           }

}

 

 

메인 공격함수 호출 아직은 다행성이 아니다.

 

class Main{

           public static void main(String[] args){

                       Z z = new Z();

                       z.attack ();

                       T t = new T();

                       t.attack ();

                       p p = new P();

                       p.attack ();

           }

}

 

 

하위는 상위에 담을 수 있다.

 

class Star{

}

 

1).

 

class Z extends Star{

           public void attack(){

                       System.out.println("저그의 공격");

           }

}

 

2).

 

class T extends Star {

           public void attack(){

                       System.out.println("테란의 공격");

           }

}

 

 

3).

 

class P extends Star {

           public void attack(){

                       System.out.println("프로세스의  공격");

           }

}

 

 

메인 공격함수

 

class Main{

           public static void main(String[] args){

                       Star s = new Z();

                       s.attack ();->여기가 에러난다.

                       s= new T();

                       s.attack ();->여기가 에러난다.

                       s= new P();

                       s.attack (); ->여기가 에러난다.

           }

}

 

 

3개의 attack()을 호출하기 위해서 s.attack ();

 

class Star{

           public void attack(){

          

           }

}

 

 

아래것으로 하면 각자 자기의 것만 호출한다. override의 기능

 

class Main{

           public static void main(String[] args){

                       Star s = new Z();

                       s.attack (); //Zerg

                       s= new T();

                       s.attack ();//Teran

                       s= new P()

                       s.attack (); //Protoss

           }

}

 

 

모든 단축키는 하나만 눌어면 된다.

Unit u = new Tank();

u.attack() -> Tank attack을 부른다.

 

star, attack()필요는 없지만 깔끔하게 하기 위해서 이다.

블록이 있는데 내용이 필요 없을 때

 

class Star{

           public void attack(){

           //block이 있을 경우 내용을 입력할 수 도 있다

           }`

}

 

 

 

내용이 필요없을 때 abstract로 하면 된다.

 

abstract class Star{

           public abstract void attack();

           // abstract있으면 내용이 필요없다.

}

 

 

class abstract Star =>인스턴스를 못 만든다. new Star()할 필요없다.

상속을 해서 쓰는 것 abstract class

c## virtual 이라고 부른다.

 

예전에는 게임을 c로 했지만 객체 지향이 없어서 요즘에는 사용하지 않는다.

 

12. 다형성 구현 실습

1).다향성과 상관없이 Terran,Zerg, Protoss의 공격 메소드를 생성하고 Mian에서 실행하는 코드를 작성하고 실행

 

=> Terran클래스를 생성하고 attack 메소드를 구현

public class Terran {

           //테란의 공격 메소드

           public void attack() {

                       System.out.println("탱크로 대포를 쏘고 마린으로 총을 쏩니다.");

           }

}

 

=>Protoss클래스 생성하고 attack메소드를 구현

public class Protoss {

           //프로토스 공격 메소드

           public void attack() {

                       System.out.println("칠럿은 찌르고 드래군은 공을 던집니다.");

           }

}

 

=> Zerg 클래스 생성하고 attack메소드를 구현

public class Zerg {

           //저그의 공격 메소드

           public void attack() {

                       System.out.println("저글링은 떼리고 히드라는 침을 뱉습니다.");

           }

}

 

=> Main 메소드를 소유한 실행 크래스를 만들고 3개 클래스의 Attak을 호출하는 코드를 작성

public class Main {

 

           public static void main(String[] args) {

                       Terran t = new Terran();

                       t.attack();

                      

                       Protoss p = new Protoss();

                       p.attack();

                      

                       Zerg z = new Zerg();

                       z.attack();

 

           }

 

}

 

2)위까지 실행하면 3개의 메소드를 호출할 수 있습니다.

지금은 3개 클래스의 인스턴스를 가지고 메소드를 호출하기 위해서 3개의 변수에 각각의 인스턴슬르 대입해서 메소드를 호출햇습니다.

 

메소드를 호출하는 코드가 다릅니다.

인턴페이스에 메소드를 연결할려고 하면 3개의 명령어가 필요합니다.

 

하나의 명령어로 3개 메소드를 모두 호출할 수 있도록 하기 위해서 동일한 코드가 3개의 메소드를 호출할 수 있도록 변경

 

=>Terran, Zerg, Protoss를 클래스의 인스턴스를 모두 저장할 수 있는 변수를 만들기 위해서 3개 클래스에 상속할 상위 클래스를 생성하고 메소드를 오버라이딩 할 수 있도록 attack을 구현

 

public class Starcraft {

                       //하위 클래스의 인스턴스가 attack을 호출할 수 있도록 오버라이딩을 위한 메소드

           public void attack() {

                      

           }

 

}

=>Terran, Zerg, Protoss클래스에 Starcraft클래스를 상속하도록 클래스 선언문 수정

public class Terran extends Starcraft

 

public class Zerg extends Starcraft

 

 

public class Protoss extends Starcraft

 

 

 

=>main 메소드 수정

public class Main {

 

           public static void main(String[] args) {

                       Starcraft s = new Terran();

                       s.attack();

                      

                       s = new Protoss();

                       s.attack();

                      

                       s = new Zerg();

                       s.attack();

 

           }

 

}

 

대입받는 문장은 에러가 안나는데 attack받는 문장은 에러가 난다.

 

andriod 스마트폰 등은 메뉴가 거의 없다.

그래서 스마트폰 은 설명이 먼저 있다.

GUI

DOS는 명령어 하나가 한가지 일 밖에 안한다.

다향성 때문에 여라가지 기능이 있다.그래서 기능이 다를 수 있다.

다향성 설정에서 언어가 바꾼다고 해서 명령은 바꾸지 않는다. 똑같은 인터페이스 일을 한다.

프로그램을 쓰기 쉽게 사용하기 위해서이다.

인터페이스는 표준어 만드는 것이다.

 

 

반응형

'Study > Java' 카테고리의 다른 글

java-8  (0) 2020.09.28
java-7  (0) 2020.09.27
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22
java-3  (0) 2020.09.20

+ Recent posts