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
  • undefiend : 변수는 존재하나, 어떠한 값으로도 할당되지 않아 자료형이 정해지지(undefined) 않은 상태
  • (어떤 값도 할당되지 않아서 자료형을 알 수 없음)

 

  • script안에는 전역객체가 존재한다. 

 

  • 전역객체 window에 속성을 붙이는 일(함수안에서 var x =1 로 지역함수 선언해줄것)
  • 함수도 객체이다.

new Function("파라미터","구현부분;");

파라미터안에 형식없음 (var (X) )

표기식 선택가능

함수는 객체

add가 함수객체를 참조한다.

마지막: 선언하면서 동시에 대입

두번째를 가장많이 쓴다.

문장이끝나면 세미콜론쓰자

함수정의 방법 

1. var add = function(x,y){ }

변수는 미리준비되어있지만 그 변수가 function은 아니다. (대입이 아직 안되었기때문이다)

함수보다 우선해서 함수를 호출할 수 없다.

 

2. function add(x,y) { }

변수선언과 동시에 같이 대입이되서 함수를 밑에다 정의해도된다. 

 

지역화

스크립트에서는 중괄호가 변수 영역을 나누지않음

 

밖에서 a를 볼수도 쓸수도없다.

x = 1;로 선언을 하면 오류가 안난다. 

전역변수에 x가 붙는다.

1이 출력된다.

var x = 1;로 선언을 하면 오류가 난다. (지역변수)

x 는 완전히함수의 지역변수

함수가끝날때 스택에서 사라진다.

객체안에서 객체를 정의하듯이 함수안에서 함수를 정의한다.

우 : 3이 결과로나온다. 전역변수의 값이 바뀌는것
a는 함수가끝나면 f1()안의 a를 쓸수없다. 우 : 함수를반환할 수있다.

 

f2의 역할이 f1의 a를 반환하는것

우 :  a가 사라지지않는다.

이유 : f2()때문이다.

참조변수는 참조하는애가있으면 안사라져요

 

f2가 x를 계속쓰니까 f1의 x가 죽지못하고 살아난다.

리턴된 f2가사라질때까지 

리턴된 함수를 클로저라고부른다

 

Q. var f = f1();

f1() : f1의 리턴값을 줘 ->f2()

 

Q. var a = f 가아니라 var a = f() 인 이유 ?

var a = f 이면 a도 f1()을 가리키게된다.

a를 출력하면 f2()함수가 출력된다.

 

Q. var a = f(); 의 의미

f() 참조변수 f가 가리키는 f2()의 반환값을 호출한다. 

 

 

함수는 함수를 반환할 수있다.

f는 자기가 갖고있는 지역변수가 없다. 자기 outer함수의 지역변수를 반환하고있다.

f1()이 반환되고 끝났음에도 f1()의 지역변수는 죽지않고 살아있다.

 

f1의 반환값이 함수가아니라 x였다면

f1()이 호출되고 반환하고 지역변수는 사라진다

함수는 함수를 반환할 수 있다. 반환할때 inner함수가 outer변수를 사용한다면 outer변수가 사라지지않는일이 발생한다.

의도적으로 한게아니라면 주의해야한다

텍스트,인라인계열에서 범용도구 <span>

두가지 질문

1.util style?? 

2. 색깔이 자주 쓰일색인가 ?

 

기본색 + 강조색 

강조색을 바꾸고싶다면 ? 

일괄작업 , 반복적수정작업 

색깔의 집중화

색깔을 변수화

바디영역안에서 쓸 변수선언 후 해당위치에서 변수를 호출한다. 

공통된 색깔을 사용하기위해 변수화

 

문서전체에 적용 :root

html태그보다 넓게 감싼다

developer.mozilla.org/en-US/docs/Web/CSS/:root

html

나중에 한꺼번에 변경 및 유지보수하기 용이해진다.

 

  1. url맵핑을 하는순간 톰캣이 @webServlet을 찾는다. 
  2. public class Calc extends HttpServlet{ }을 메모리에 올린다.
  3. "/calc" url요청에 맞게 Calc클래스를 수행한다.

 

어노테이션을 이용한 URL 매핑

Nana를 실행하려면 사용자에게 요청할 url를 주면서 그 url과 Nana를 맵핑해야한다.

맵핑을 위해 web.xml파일을 사용했었다.

사용자가 주소창에 ?c=10를 쳐서 보이도록했었다.

<input type="text" name="x">+<input type="text" name="y">

구분자 &

구분자 : &

사용자가 입력한값을 전달받아서 계산할 서버프로그램 : Calc 클래스 생성하기

직접입력하지말고 불러올것

ctrl + space하면 ->se치면 ->선택 ->오버라이딩된다.

web.xml을 url맵핑을 해줘야한다

metadata-complete="false">

맵핑정보 설정시 xml과 어노테이션으로 할 수있다.

metadata를 true로 하게되면 모든 메타데이터가 web.xml에 있는것으로 된다.( 정보를 xml에서 찾게된다)

false로 하면 어노테이션한부분을 찾게해준다

 

url은 항상 소문자로 

자바코드가 달라지면 재시작할것

@webServlet("/calc")

 

webSevlet 추가 , 이름도 add로바꿈

 

좌 : 자기페이지를 요청한다. / 우 : html이 빠진 calc에게 x,y값을 보낸다

   <form action="/add">

<form> 태그의 action 속성은  데이터(form data)를 서버로 보낼 때 해당 데이터가 도착할 URL을 명시합니다.

 

html페이지는 값을 받거나 계산하는 능력이없다. -> 정적인 페이지

<form action="서버코드 url">

 

서버를 재실행하고 3,4를 입력후 덧셈버튼을 누르면 404 오류가 발생한다.

좌: JSPPrj이 들어가있다. 우 : 로컬호스트에서 바로 add를 찾고있다

1.프로젝트명을 같이 붙여주거나 2. 내 프로젝이 콘텐트명이 없도록해야한다.(바람직)

가운데에서 -> 오른쪽으로 사용될수있게 해야한다

 

프로젝트명떼고 루트를 쓸 수 있게바꾸자

프로젝트가 서버에 있는 자원을 요청할때 항상 이 프로젝트명이 들어가는 문제가 발생한다.(계산기페이지에서 프로젝트명이 url에있음)

프로젝트명이 매번들어가는것은 바람직하지않다.

 

1 . 해당프로젝트 선택 -> 속성 Properities -> web project settings -> JSPPrj지우고 - > /넣어서 루트로 바꿔준다.-> apply and close

 

2. 오른쪽 서버탭에서 기존 서버를 지워야한다. delete -> ok

3. 서버를 재실행한다 

프로젝트명없이 나온다.

x와 y값을 받아서 사용자화면에 더한 값을 출력해보자 

콘솔창반응

입출력은 다문자열만가능하다

세번째 : 사용자가 덧셈을 누를때마다 calc이라고 서버에 출력된다

사용자가 3,4를 입력하면 3,4라는 문자열이 저장된것

String x_ = req.getParameter("x"); 사용자가 입력한값을 받아서 x에 넣는다.

문자열출력은 resp.getWriter().println(x+y);


Q. resp.getWriter().println(x+y);

PrintWriter out=response.getWriter();

URL창에 출력결과가 나와 클라이언트가 볼 수 있다.

 

먼저 위의 response는 서버가 클라이언트에게 '응답'한다는 의미를 가진 객체입니다.

서버가 클라이언트에게 '응답'하려면 무조건 response라는 객체를 통해 작업을 해야합니다.

여기서 getWriter()는 '쓰기'를 통해 응답하겠다는 메서드입니다. 데이터타입은 PrintWriter입니다.

html페이지에 원하는 결과를 출력

 

out.print("Hello Servlet");  브라우저에 Hello Servelt이 뜬다.

Q. 웹프로그램과 콘솔프로그램의 차이 ?

  1. 입/출력 도구가 추가되었다.
  2. 실행을 직접할 수 없다. 톰캣에 의해서 실행되도록 한다.
  3. 톰캣이 실행될 수있도록 서블릿코드를 만들고 url을 맵핑시켜서 톰캣이 내것을 실행
  4. 자바와 비슷하다.

Q. 스트림버퍼를 통해 읽어오는것은 모두 문자열이다.

콘솔입력이든 , 파일입력이든, 네트웍 입력이든 모두 버퍼를 쓴다.

문자열 코드를 읽어오는것.

 

Q.톰캣에 메모리가 언제 올라가는지 ?

요청을 받을때 먼저 메모리에 올라가있는 지 확인, 없으면 메모리에올린다.

자주사용하는 url같은경우 (ex. index) timeout이있다.

처음요청할땐 서블릿이 로드해야하므로 살짝느리다.

 

Q.request:입력도구 , response:출력도구 는 WAS에만 있나?

입력은 요청하면서 같이온다. 사용자가 요청하면서 가져온데이터를 알려준다.(쿠키 등) WAS는 자바에서 주로 쓰임

어플리케이션실행을 도와줌, 웹서버는 입력 도구가 필요없다.

서버쪽에서 프로그램을 동작시킬 수있는 환경을 갖고있으면 입출력도구를 제공한다

 


 

11

캡슐화

-은닉성

 

상속(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키워드가 붙은변수는 서로 데이터를공유

 

 

배열에서 식별자 : 인덱스

자동화된 인덱스 순환구조

 

오브젝트의 식별자 : 키

obj[속성명]

for in 문으로 객체를 갖는 속성을 순환할 수있다.

 

항상 선언이 먼저 인식되고(stack에 올라감) 연산절차가 진행된다. 

 

인터프리터 : 소스코드바로실행, 버추얼머신

컴파일러 : 소스코드번역해서 ->번역된결과물실행

모든객체에 속성을 마음대로 붙일 수있다.

 

앞에 아무것도 안붙이면 전역변수

var를 붙이면 지역변수가 되는데, 함수를 선언하고 그안에서 var로 선언해야 지역변수가 된다. 

console.log(a);

var a = 1;하면 

undefined가 나온다. 오류가 아니다.

선언이 되지않은걸 실행하면 오류가 날것같은데.. 오류가 아니고 undefined가 나온다.

  • 선언한것은 코드가실행 되기전에 미리 stack에 올라간다.
  • console.log(a)이후에 var a를 선언했어도 정의/선언된걸 먼저 찾기 때문이다. 이 후 연산이 진행된다.
  • var a는 실행문장이 아니다.

 

 

 

 

var x 가 스택에 올라간다. 

선언이 뒤에가있어도 

코드실행시 선언된것이 먼저 캐치되서 준비되고, 연산이 실행된다.

 

window.가 생략된것 

window객체의 변수 (this.처럼생략)

윈도우에 a를 추가한것으로 이해한것

  • <script>는 전역영역
  • window라는 전역객체가있다.
  • 변수선언하지않고 a = 1;라고 쓰게되면, (window.)a = 1; 전역객체에다가 a속성을 정의 한것이다.
  • alert도 window객체의 함수다. (window.)alert(a); 
  • 기본적으로 window객체를 기본적으로 활용하는 영역이기때문에 생략된다 

window. 이 생략된것

 

자바와 비슷하다.

this에 a가있어.

지역변수에 a가있나 봤더니 a가 없어.  - > this에 a가 있나 ? -> int a 있다 -> f1()에서 대입하고있는 3은 this의 a속성에 대입된다.

 

var를 붙이는것 : 지역변수선언

진짜지역을 갖고있는 블록이 존재하면 거기서 var를 붙이면 그 지역에서만 사용할 수 있는 변수가 만들어진다.

{ }를 안하면 선언헀던 안했던 전역변수가 된다.

 

오류가 안난다...지역화안되나요 ?

자바스크립트에서 지역화는 없다.

함수지역만 가능하다. es 5버전

함수내에서 var를 붙이면 의미가 달라진다 

오류가 나지않는다.

 

Pseudo-classes

 

테이블구분 이미지 넣기

첫번째애한테만 적용제외하기

번호앞의 이미지가 가라졌다.

현재페이지정보 글자 오른쪽정렬

 

위아래 같은것

배열표현

데이터를 구분하기 위한 표현방법

오브젝트 notice의 title키의 값 hello출력
' ' 문자열이다. 오브젝트객체를 표현하는 표기법으로 쓰여있지만 현재문자열이다.

담겨진건 객체가 아니라 문자열이다. undefined로나온다

 

문자열로 넘겨진것들을 객체로 받으려면 ?

 

"x=3;"을 출력하면 

undefiend 

eval()은 문자열을 코드로 인식하게 하는 함수

자바스크립트라는 코드를 실행해주는코드

eval은 코드를 실행해준다.실행되는 코드가 한문장으로 완벽해야한다

 

위에는 완벽한 문자열이아니라서 오류

인터넷에서 가져온 문자열이 [2,3,4,5]였다면 ( )으로 감싸줘야한다

( )으로 감싼것                                                              ( )을 각각 문자열더해줌

( )으로 감싼 뒤 배열객체 data에 담긴다.

4가 출력된다.

문자앞뒤에 ()감싸면 

자료제공자가  ( )붙여서 줄수없을수 있으니

받은데이터에 ( )를 덧씌우는 json = "(" + json + ")"를 거치고 eval()해서 객체화

 

""안써도 id, title을 키값으로 안다
일반적이지않은 키값은 " "쓰고, 호출할때는 [" "] 묶는다

JSON Parse 

JSON형태라면 json을 객체로 인식해서 파싱해준다.

parse 메소드는 string 객체를 json 객체로 변환

키의 표기는 따옴표

키값을 완벽히 문자열로표현

제이슨파스쓸때는 키 를 더블따옴표로" "  써야한다

각 키값을 "  "따옴표 (문자열형태)을 써야한다 aaa출력 

반대로 JSON문자열로 바꿔야한다면 ?

JSON.stringify

json 객체를 String 객체로 변환시켜 줍니다.

 

eval("var ar = " + data + ";" );

data의 문자열을 ar 배열에 담는다

배열0번째의 co값을 출력한다. 0.6

== 값만비교 (.equals())

===참조비교  

for in

키를 뽑아내주는 제어구조이다

그 안에있는것들을 하나씩꺼내서 전체를 순회하는데 도움을준다

ar의 데이터를 식별할때 유일한 식별자는 순서다

 

전체다 순회할때

ojt의 식별자는 key다 kor, eng, math (키는순서가없음)

오브젝트를넣으면 오브젝트의 키를 뽑아낸다

키값을 담을수 있는 변수가 k인것

 

오브젝트는 확장이가능하다.

 

영역을 넘는 콘텐트 처리

높이가 계속커진다.

층을만들어낸다 -> 막는속성

 

  white-spacenowrap;

제목이 층을 만들어내지않게 하기

 overflowhidden;

넘치는 글자 가리기

   

text-overflowellipsis 

오버플로우된 글자는 ...점으로 생략된다

테이블의 헤더넣기

 

테이블의 제목열만 왼쪽정렬하기

 

테이블의 헤더와 바디구분

tbody를 넣지않으면 html이 알아서 table과 tr사이에 tbody를 넣어준다

thead와 tbody를 넣어 구분한다.

요청했던 사용자의 브라우저에 문자열을 돌려주자 

HttpServletRequest request : 사용자가 요청할때 우리에게 입력값을 줄 수있다.

HttpServletResponse response : 우리가 사용자에게 입력할때 사용 할 수 있는 도구들을 담아두고있다.

자바 +웹출력도구 ->웹입출력가능

 

 

요청한 사용자에게 웹을통해 출력이된다.

 

콘솔출력했던것들이 사용자에게출력가능 , 웹을 이용해 출력

10번 반복 출력

 

 


사용자가 요구하는 만큼 반복해보자 

주소에 물음표뒤에 &구분자가있다. 키와 값을 쌍으로하는 값이 나열되어있다.

사용자가 부가적인 정보를 질의하는것과 같다. 

햄버거가게 : 치즈버거+양파제외+ ~~

커피숍 : 아메리카노 + 샷추가  등등

가게와 손님이 약속이된 한도내에서 질의요청 - > 제공

 

 

사용자가 c라는 키워드로 값을 전달

?c=5 5번요청

 

 

request.getParameter("c") //약속된키워드 c

약속된 키워드를 읽어봤더니 null아니다 -> 사용자 값을 이용한다 count = Integer.parseInt(c);   

약속된 키워드를 읽어봤더니 null이다 -> 기본값 int count = 10;

 

 

사용자가 ? c=20을 입력하면 20번반복되어 출력된다.

hello를 달라고하면서 추가옵션 c=20을 요청한것

 

 

검색폼이 물음표뒤의 값을 만들어줄것

 

Get Request -> QueryString(폼태그를이용하게될것)

(톰캣이 WAS서버를 탑재)

어플리케이션을 실행해주는것을 통해 실행하면 실행되는 시작은 원격에 있는 브라우저가 요청하므로써 실행된다.

문자열출력은 PrintWriter를 이용할것 

PrintWriter out = response.getWriter();


전달하고자하는 데이터형태

브라우저가 받는건 데이터를 직접받지않고 웹문서를받는다.

 

문서를 출력 : 브라우저(웹문서 뷰어)

데이터 출력 : 데이터요청하는게 자바스크립트

1.브라우저에서 스크립트가 동작하지않는 환경이라면 문서출력

2. 스크립트가 동작하는 환경이라면 문서대신 데이터를 제공하므로써 데이터를 가지고 스크립트가 문서를만들게한다. 

 

 

 


만든 calc.html파일의 인코딩이 EUC-KR이다.

 

알트 엔터->속성 조회  

 

calc.html파일을 지우고 UTF-8을 적용해보자

window -> preference -> web -> HTML , CSS, JSP UTF-8선택후 Apply적용

 

UTF-8적용된모습

 


서버실행시 다른프로세스에서 이미 실행중이라는 오류 

1. 작업관리자 열기 -> 세부정보 -> java검색

2. 콘솔창 -> netstat -ao -> 8080찾기 -> 작업관리자에서 26872쓰는 프로그램찾기 

3. zoom이 8080을 쓰고있다..일단 포트번호만바꿔서사용해보기 

 

 

 

ctrl + c + ipconfig 

 

 

인터페이스

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

자바 인터페이스란 객체 간의 조립을 간접적으로 조립하게 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이 인터페이스를 구현했다면 ? 

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


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

 


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

 

패키지명이달라져서 라이브러리명이달라짐

자카르타, 인코딩명이달라짐 (유티에프?)

톰캣이 제공하는 API가 달라졌을 경우, 그것을 활용하는 상위 라이브러리들이 달라지는데 시간이걸린다.

최신버전의 Spring이 과거버전의 서블릿을 쓰고있다. 최신버전의 서블릿을 쓰면 나중에 호환성 문제가 발생할 수있다.

 

어제 작업


서블릿이란 서버어플리케이션을 만든느것
기능벼로 코드가나뉘어짐
선택적실행

 

이클립스를 사용안하면 .. 
소스코드고치고
컴파일
클래스파일복사해서 클레스즈에 다시 붙여넣기
톰캣다시끄고시작하기
스타트업다시시작
서벗다시
주소입력다시


이클립스를 이용해서 톰캣을 실행->서블릿 실행

메모장보다 편리! 

web.xml이 서블릿을 실행하는 중요한 설정(설정내용이해)

브라우저를 띄우고 + 주소입력 해야했지만 web.xml를 선택하고 ctrl +f11누르면 쉽게 브라우저를  띄워서 그 주소까지 입력할 수있다.

 

 

Java EE

이클립스한테 톰캣실행해주도록 해야한다

서블릿코드는 톰캣에 의해 실행된다. 런타임환경을 구축해야한다. 

이클립스 다이나믹 웹 프로젝트 -> 타겟런타임 -> 뉴 런타임-> 내가 사용할 톰캣버전선택 -> 디렉토리선택 -> 9.0 홈디렉토리선택 bin이 보이는 폴더

 

WebContent 톰캣이 사용하는 기본폴더 -> index.html생성 -> "안녕하세요 " 입력

이클립스를 사용하지 않았을 경우, 톰캣을 직접 실행하고 브라우저를 열고, 로컬호스트번호로 요청해야한다.

WEB-INF에 기존 web.xml파일을 붙여넣기한다

 

웹출력

컨트롤 에프11(실행)

좌 : 이클립스내에있는 브라우저에 안녕하세요가 뜬다 / 로컬호스트주소를 브라우저창에뜨면 동일한 결과가 뜬다 
디폴트 브라우저 지정하기

패키지 추가 후 Nana.java파일 넣기 

실행시 런초록버튼 누르지말것 : Nana.java을 실행하는게 아니라 서버만 실행하는것 ->브라우저가 뜨지않는다

다시 런버튼을 누르면 서버만 계속 실행하는것 

splice(인덱스번호,삭제여부,추가할숫자)

중간에서 값을 삭제하거나 넣기 

 

nums.splice(2) 인덱스 2번부터 삭제해

nums.splice(2,2)

인덱스2번에서 2개를 삭제해.

nums.splice(2,0,3)

인덱스 2번에서 삭제를 안하고 3을 넣는다 (가운데가 0이면 삽입)

nums.splice(2,1,3)

인덱스 2번에서 삭제를하고 3을 넣는다. (가운데가 1이면 교체)

인덱스 2번에서 삭제안하고 3,4,5삽입

 


slice(시작,끝)

일부분을 추출함. 일부분 가져옴

익스클루시브 

(1,3) 1부터2까지 짤림


indexOf(3) //  해당숫자의 인덱스번호 

찾았으면 0이상

해당인덱스가 있으면 양수 , 없으면 음수


기본데이터형이 다 객체다.

객체지향언어이다.

인터프리터언어라 미리 정의하는것이 발달되어있지않다.

미리정의하는걸 안좋아한다.

 

미리정의하지않았어도 초기화하면서 동시에 정의가 된다. 먼저생성하고 정의함.


변수이름 대소문자 주의 

변수이름을 미리 정의하는게아니기 때문에 오타실수가 발생할수 있다

씨플플,씨샵,자바는 정의를 하고 객체를만든다 -정적인객체정의
자바스크립트는 객체만들고 정의 - 동적인객체정의
기본기를 잡기위해 자바스크립트를 배우고있다
가능하면 타임스크립트가 낫다
보안장치가있다.
앵귤러:기업형적합
자유도:리액트
모바일:뷰제이에스

속성명에 -(대시)를 쓸 수 없다.

속성사용할때는 문자열형태로 바꿀 수있다. 대시가 들어가던 안들어가던 사용가능 대괄호로 감싸기

문자열로표현한 속성은 대괄호 이용한다.

math는 유효한 속성명이라 두가지 방법 모두 가능하다.

"w-1" -대시가 들어가면 유효하지않은 속성명이므로 괄호를 써준다 

Object표기

위아래 같은것

 


JSON 생성방법

키와 값을 한번에 저장하는 컬렉션 등장 

객체를 직접만들 필요없다.

문자열과 문자를 같이 취급한다. (모두 문자열) " " ' ' 모두가능,

쌍따옴표,홑따옴표모두가능 하나 일단 쌍따옴표쓰는것으로 기억하기 

 

앞으로 배열생성할때 위와같이할것

객체를 제이슨표기법으로 만들기.

불,넘버,스트링,어레이빼고 모두 오브젝트임 (type)
불편

exam.a는 exam객체의 a 키를 부른것인데 exam객체중에 a 키는없다. 그래서 undefined

exam[a]는 exam객체의 키값을 a변수를 통해 "kor"속성명의 30값을 호출했다.

마진으로 다른애들이 못쓰고있음 파란색만큼만쓰고있음

width를 100%로 준다.


순번 : 컬럼순서가 바뀌거나 구조가바뀌면 번호를 다 바꿔줘야한다

이름 : 구조가바뀌어도 상관없음,

특화된 종속해서보다

스타일로서의 의미를 살리는 키워드를정하는게낫다

이름하고값이랑안맞아

이름을 값으로썻지만 나중에 값수정할 때 이름도수정해야해

border-collapsecollapse; 셀양쪽벽을 합치는 속성

테이블 셀사이의 보더를 없앴다. (마진이 아니다)

 

  table-layoutfixed;

fixed를 설정하지않았을 경우 컨텐츠가 길어지면 다음줄로 내려가고, 옆칸의 너비를 뺏어온다. 

우측 픽스드 적용 

 

 

객체지향프로그래밍

캡슐화 -> 엮어내기(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);
		
	}
}

main에 padding 넣기 

패딩 : 상단, 오른쪽, 아래, 왼쪽

 

+ Recent posts