JAVA 상속

 ->재정의 하고자 하는 자식 클래스에서 메소드 위에 @Override 적어주면 된다.



 ->재정의한 자식 클래스에서 재정의 한 메소드에서 부모 클래스의 메소드를 사용하고 싶으면 super.메소드() 를 사용한다.


->MainClass 에서 클래스를 자식 클래스를 생성하는데 오른쪽에 ParentClass의 생성자 부터 작동하는 것을 볼 수 있다. 즉, 부모클래스가 먼저 생성되고 자식 클래스가 생성된다는 것이다.

'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA 싱글턴 패턴  (0) 2018.07.19
자바 interface(인터페이스)  (0) 2018.07.18
자바 Static 변수  (0) 2018.07.16
리펙토링(Refactoring)의 원칙과 정의  (0) 2018.07.16
[JAVA 자바] 백준 1152번 단어의 개수  (1) 2018.07.08

 static 변수는 팀원들과의 '공유'라고 생각할 수 있다.

 static은 클래수 변수이기 때문에 변수를 static으로 선언하면 다른 패키지에서 객체를 생성하지 않고도 바로 변수에 접근 할 수 있다.



MONEY 를 static 변수로 선언한다.



import를 위와 같이 해주고 바로 MONEY 변수에 접근한다.



이제 메인 클래스에서 FirstChild 클래스에 있는 메소드를 불러와 사용한다.


static 의 장점과 단점



리펙토링 원칙

코드의 양을 줄어야 합니다. 한 메쏘드에 5줄이 넘어가면 의심해 봐야 합니다.

모든 것을 다 할 수 있는 슈퍼 메쏘드/객체는 없어야 합니다. 한가지 기능을 하도록 단순하게 해야 합니다.

작고 응집력있게 만들어야 합니다. - SOLID 중에 SRP

중복제거! - DRY Don't repeat yourself!!

종속성 제거 - 종속성을 줄이기 위해 노력해야하는 것이 아니라 없애야 합니다.

자체 문서 작성 코드 - 주석이 필요 없이 코드를 보고 이해할 수 있도록 해야 합니다.

코드는 보는 즉시 이해할 수 있어야 합니다. - 코드의 양을 줄이는 것을 의미하는 것이 아니라 명확하게 표현되어야 합니다. 

원시적인 강박관념을 피하세요. - 높은 추상화 생성에 집중해야 합니다.

자주 확인하고 작은 단계로 진행하세요. - 모든 커밋은 한 개의 변경사항만 가지고 있어야 합니다.- 1 commit 1 change

피드백 주기를 단축시키세요.

다른 개발자는 루프에 보관하세요.

커다란 고통스러운 머지는 피하세요.

코드를 한 종류의 추상화 수준으로 맞추세요. - 모든 메소드는 한가지만 해야 하고, 각 메서드는 각각 한 가지 작업을 하는 다른 메서드에 위임해야 합니다.



리펙터링 하지 말아야 할 때.

다른 코드를 변경하는 동안 리펙터링하지 마세요. 리펙토링을 기록하고 버그 수정이나 기능 변경이 커밋되면 완료하세요. 절대로 다른 코드가 변경되는 동안에 리펙토링을 수행하지 마세요. 

나쁜 냄새를 맡으면 메모를 남깁니다.

하던 일을 마무리 짓습니다.

커밋합니다.

리펙터링 시작

혼자서 리펙토링하지 마세요. 문제에 대해 눈 2개를 같이 가지고 진행해야 합니다. 페어 프로그래밍은 리펙토링하는 동안에 필수적입니다. 짝은 코드를 이해하기 쉽게 만들고, 좋은 이름을 가지고 기존 로직을 망치지 않는데 도움을 줍니다.



리펙토링 해야 할 

버그 수정이나 기능 변경 전이나 후에 리팩토링 할 수 있습니다.

변경으로 인해 코드 디자인이 개선된다고 생각한다면

변경으로 인해 다른 개발자를위한 코드의 가독성이 향상된다고 생각한다면




Refactoring(리펙토링)의 정의 



https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Math/pow

String 변수에 입력 받은 값을 charAt()을 사용하기 위해 String으로 다시 변환하려면 String.valueOf(char형)을 사용해야

한다는 것을 알았다. 

다음은 코드이다.

다음은 꼼수(?) 코드이다.

소수점 자리를 표현 하는 방법에 대해서 포스팅 하려한다.



출처 : https://linediffuser.blog.me/220840699390

성능 향상 보조 스트림이란?

 : 프로그램의 성능은 입출력이 가장 늦은 장치를 따라가게 되는데요.

예를 들어서 CPU 랑 메모리의 성능이 아무리 좋다고 해도 하드 디스크의 입출력 늦다면

프로그램의 실행 성능은 하드 디스크의 처리 속도에 따라 맞춰갑니다.

네트워크도 느린 네트워크 환경이라면 컴퓨터의 성능이 좋더라도 메신저 또는 게임의 속도가 느려집니다.

이에 대한 완전한 해결책은 없는데요, 프로그램이 입출력 소스와 직접 작업하는 대신에

중간에 메모리 버퍼와 작업함으로써 실행 성능을 어느 정도 향상 시킬 수는 있습니다.

BufferedInputStream 과 BufferedOutputStream은 바이트 기반의 성능 향상 보조 스트림이고,

BufferedReader 와 BufferedWriter는 문자 기반 성능 향상 스트림입니다.


BufferedInputStream과 BufferedReader :

 BufferedInputStream은 바이트 입력 스트림에 연결되어서 버퍼를 제공해주는 보조 스트림입니다.

BufferedReader는 문자 입력 스트림에 연결되어서 버퍼를 제공해주는 스트림입니다.


위의 스트림은 둘 다 입력 소스로부터 자신의 내부 버퍼 크기만큼 데이터를 미리 읽고 버퍼에 저장합니다.

생성자 매개값으로 준 입력 스트림과 연결되어 8918 내부 버퍼 사이즈를 갖습니다.

BufferedInputStream bis = new BufferedInputStream(바이트 입력 스트림); //  최대 8912 바이트

BufferedReader br = new BufferedReader(문자 입력 스트림); // 최대 8912 문자


스트림이 데이터를 읽어들이는 방법은 InputStream / Reader 와 갖습니다.


예제)

import java.io.BufferedInputStream;

import java.io.FileInputStream;


public class Example {

 public static void main(String[] args) throws Exception {

  long start = 0;

  long end = 0;

  

  FileInputStream fis1 = new FileInputStream("파일 경로/image.jpg");

  start = System.currentTimeMillis();

  while(fis1.read() != -1) {}

  end = System.currentTimeMillis();

  System.out.println("사용하지 않았을 때 걸린 시간: " + (end-start) + "ms");

  fis1.close();

  

  FileInputStream fis2 = new FileInputStream("C:/apache-tomcat-8.0.20/webapps/thisisjava/src/forest.jpg");

  BufferedInputStream bis = new BufferedInputStream(fis2);

  start = System.currentTimeMillis();

  while(bis.read() != -1) {}

  end = System.currentTimeMillis();

  System.out.println("사용했을 때 걸린 시간: " + (end-start) + "ms");

  bis.close();

  fis2.close();

 }

}

예제를 실행시켜보면 시간 차이가 꽤 많이 나는 것을 확인할 수 있습니다.


예제2)

예제2) BufferedReader / readLine()메서드를 추가적으로 가지고 있음. 

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.Reader;


public class Example2 {

 public static void main(String[] args) throws Exception {  

  InputStream inputStream = System.in;

  Reader reader = new InputStreamReader(inputStream); 

  BufferedReader bufferedReader = new BufferedReader(reader);

  

  System.out.print("입력: ");

  String lineString = bufferedReader.readLine();

  

  System.out.println("출력: " + lineString); 

 }

 

}



BufferedOutPutStream :

바이트 출력 스트림에 연결되어서 버퍼를 제공해 주는 보조 스트림입니다.

BufferedWriter :

문자 출력 스트림에 연결되어 버퍼를 제공해주는 스트림입니다.


위 두 스트림은 프로그램에서 전송한 데이터를 내부에 두었다가 버퍼가 꽉 차면 버퍼의 모든

데이터들을 한번에 보냅니다.

BufferedOutputStream bufferedOutputStream

 = new BufferedOutputStream(바이트출력스트림); // 최대 8912바이트

BufferedWriter bufferedWriter

 = new BufferedWriter(문자출력스트림); // 최대 8912 문자


출력 방법은 OutputStream/ Writer 과 동일합니다.

예제)

성능차이를 보여주는 예제

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.FileInputStream;

import java.io.FileOutputStream;


public class Example {

 public static void main(String[] args) throws Exception {

  FileInputStream fileInputStream = null;

  FileOutputStream fileOutputStream = null;

  BufferedInputStream bufferedInputStream = null;

  BufferedOutputStream bufferedOutputStream = null;

  

  int data = -1;

  long start = 0;

  long end = 0;

  

  fileInputStream = new FileInputStream("파일 경로/image.jpg");

  bufferedInputStream = new BufferedInputStream(fis);

  fileOutputStream = new FileOutputStream("C:/Temp/forest.jpg");    

  start = System.currentTimeMillis();

  while((data = bufferedInputStream.read()) != -1) {

   fileOutputStream.write(data);

  }

  fileOutputStream.flush();

  end = System.currentTimeMillis();

  fileOutputStream.close();

  bufferedInputStream.close();

  fileInputStream.close();

  System.out.println("사용하지 않았을 때 걸린 시간: " + (end-start) + "ms");

  

  fileInputStream = new FileInputStream("C:/apache-tomcat-8.0.20/webapps/thisisjava/src/forest.jpg");

  bufferedInputStream = new BufferedInputStream(fis);

  fileOutputStream = new FileOutputStream("C:/Temp/forest.jpg");  

  BufferedOutputStream = new BufferedOutputStream(fileOutputStream);

  start = System.currentTimeMillis(); // 시작시간

  while((data = bufferedInputStream.read()) != -1) {

   BufferedOutputStream.write(data);

  }

  BufferedOutputStream.flush();

  end = System.currentTimeMillis(); // 종료시간

  BufferedOutputStream.close();

  fileOutputStream.close();

  bufferedInputStream.close(); 

  fileInputStream.close();

  System.out.println("사용했을 때 걸린 시간: " + (end-start) + "ms");

 }

}



출처: http://altongmon.tistory.com/274 [IOS를 Java]

JSP 프로그래밍을 하기 위해서 JAVA EE를 설치하고 Apache tomcat과 Eclipse를 연동하겠다.


다음 유튜브 경로는 

JSP Servlet 동영상 개발 환경 설정을 잘 설명한 유튜브 동영상이다. 참고하길 바란다.

https://www.youtube.com/watch?v=0cy1Oa-2DQg&list=PLYBmkgNU_x7Zj0nCzt5D0qV33C_rU1NK2&index=2




문제는 아무리 찾아봐도 내 이클립스에는 없다는 것이다. 도대체 어떻게 된걸까?

이클립스를 쓴지 얼마 안되는 사람이 자주 저지르는 실수 중 하나긴 하다.

사실 원인을 따지자면 설치때로 거슬러 올라간다.





이클립스가 매우 유명한 자바툴이라 마차 이클립스가 자바 전용인줄 아는 사람이 있다.

그러나 이클립스는 고작 그정도 작은 툴이 아니라 정말 모든걸 다 할 수 있는 어마어마한 툴이다.


여러분이 설치시에 web관련 프로젝트및 파일을 만들 수 없는 이유는 매우 간단하다.

설치시에 여러분은 Java Developers를 선택했다.

그러나 web을 하려면 Java EE Developers를 선택해야한다.

Java EE Developers는 Java Developers를 포함하고 웹까지 담고 있다.





Eclipse에서 Help->Install New Software를 눌러준다.





여기에 Work with에 http://download.eclipse.org/releases/oxygen(이놈엔 여러분 이클립스 버전을 적어라) 까지 타이핑하면 목록에 주루륵 생긴다.

이 목록은 여러분 이클립스버전에서 이클립스 재단이 직접 지원해주는 플러그인 목록이다.





드래그 해서 내려가면 저런 부분이 있다. 딱 찝어서 저 목록을 이야기하지는 않겠다.

왜냐하면 시대에 따라서 저 목록의 이름이 디게 많이 바꼈기 때문이다.

어쨋던 목록에 EE가 있는것을 다운받으면된다.





목록에 EE와 Web이 있는지 확인하면된다. 이제 Next와 Finish를 눌러주자.





설치가 진행된다.



다음은 Tomcat을 설치하는 과정이다
주소창에 tomcat.apache.org를 검색하고 다운로에서 Tomcat 9를 누른다.



그 후 zip 파일을 다운로드 받고 압축을 풀어준다.




그 후 이클립스에 접속하여 오른쪽 상단에 첫번째 아이콘을 클릭한 후 JAVA EE를 추가한다.

JAVA EE아이콘을 선택하고 


Window-> Show View -> Servers를 클릭한 후 서버를 선택한다.





톰캣 서버를 추가하고


프로젝트 추가하기




추가되면 아래 Server탭에 서버가 추가된다.










서버에 대한 설정을 해준다


Specify the server path (i.e. catalina.base) and deploy path. Server must be published with no modules present to make changes.


서버 경로 (예 : catalina.base)와 배포 경로를 지정하십시오. 변경하려면 모듈이없는 서버를 게시해야합니다.


Use Tomcat installation (takes control of Tomcat installation)


Tomcat 설치 사용 (Tomcat 설치를 제어 함)


publish module contexts to separate XML files


XML 파일을 분리하기 위해 모듈 컨텍스트 공개



포트 설정 HTTP/1.1 에 포트넘버를 바꿔주면된다.



이제 하단에 Servers 에서 시작버튼을 눌러 서버를 동작 시켜보자




그 후 Chrome을 켜서 http://localhost:8080 을 검색해보자

나는 포트번호를 8181로 바꿨다. 나중에 Oracle을 Eclipse와 연동할 때 내부적으로 포트번호 8080을 사용하기 때문이다.

Apache Tomcat/ 9.0.10 홈페이지가 뜨면 이클립스와 톰캣의 연동에 성공한 것이다.



설명을 한다고는 했지만 조금 정신이 없을 것이다.


https://www.youtube.com/watch?v=0cy1Oa-2DQg&list=PLYBmkgNU_x7Zj0nCzt5D0qV33C_rU1NK2&index=2


이곳에 들어가서 10분정도만 투자한다면 빠르게 연동할 수 있을것이다.


























JSP와 Servlet?? 어떤 개념을 가지고 있고 어떤 차이가 있는지 알아보도록 하겠다.

1. Servlet

 정확한 이해가 필요 할 듯 하다. 서블릿(servlet)은 서버에서 웹페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바로 작성된 프로그램이다. servlet은 Java코드 안에 HTML태그가 삽입되며 자바언어로 되어있다. .java가 확장자이다. 
 서블릿의 단어는 Server + Let의 합성어라고 알고 있는 사람도 있고 Server + Applet으로 알고 있는 사람도 있다. 사실 둘다 어려운 느낌이다. 하지만 쉽게 풀어보면 '클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 servlet 클래스의 구현 규칙을 지킨 자바프로그램'이라고 이해하면 좋을 듯하다. 
 서블릿(servlet)은 자바언어를 웹어플리케이션에 조금 더 개발하기 쉽게 하기 위해 만든 API(라이브러리, 클래스 들)이며 이 규약에 맞는 라이브러리나 클래스들을 상속 및 구현하여 만든 클래스들을 서블릿이라고 한다.

2. JSP(Java Server Pages)

 HTML을 코딩하기 너무 어렵고 불편해서 HTML 내부에 Java코드를 삽입하는 형식이 JSP이다. 다시 말해 서블릿의 단점을 보완하고자 만든 서블릿 기반의 스크립트 기술이다. 서블릿을 이용하게 되면 웹프로그래밍을 할 수 있지만 자바에 대한 지식이 필요하며 화면 인터페이스 구현에 너무 많은 코드를 필요로 하는 등 비효율적인 측면들이 있다. 때문에 서블릿을 작성하지 않고도 간편하게 웹프로그래밍을 구현하게 만든 기술이 JSP(Java Server Pages)이다.

 조금더 알아보자면 JSP(Java Server Pages)는 서블릿 기반의 '서버 스크립트 기술'이다.
여기서 스크립트 기술이란 ASP, PHP 처럼 미리 약속된 규정에 따라 간단한 키둬드를 조합하여 입력하면, 실행 시점에 각각의 키워드에 매핑이 되어 있는 어떤 코드로 변환 후에 실행되는 형태이다.

JSP는 Java소스로 사용하여 웹페이지에 접근하고 페이지 전환을 통하여 웹브라우저에 전달한다.
3. JSP와 Servlet의 차이 및 비교
Servlet
JSP
~ 자바코드로 구현하고 컴파일하고 배포해야 한다.
~ HTML태그로 문자열("")스크림으로 처리해야 한다.
~ 코드가 수정되면 다시 컴파일하고 배포해야 한다.
~ 키워드가 태그화 되어 서블릿에 비해 배우기 쉽다.
~ 자바코드를 <%%>태그 안에 처리해주어야 한다.
~ HTML처럼 태그를 사용하여 자바코드도 사용이 가능하다.
4. Servlet과 JSP의 역할

 내 용만 보게 된다면 서블릿이나 JSP나 만드는 방법에 차이가 있을 뿐 동일한 역할을 한다는 것을 알수 있다. 초기에 자바 웹개발은 서블릿을 이용한 개발이였다. 이후 JSP기술이 발표되면서 JSP형태의 개발이 유행하게 되고 지금에 와서 각각의 역할을 나누어 Servlet+JSP형태의 개발이 이루어지고 있다.

 JSP는 JSP기술의 장점을 최대한 활용 할 수 있는 웹에플리케이션 구조에서 사용자에게 결과를 보여주는 프리젠테이션 층을 담당하고 Servlet은 Servlet기술의 장점을 최대한 활용 할 수 있는 사용자의 요청을 받아 분석하고 비지니스 층과 통신하여 처리하고 처리한 결과를 다시 사용자에게 응답하는 컨트롤러 층을 담당한다.

5. MVC 패턴의 JSP와 Servlet

 얼마전까지만 하더라도 JSP만 이용한 개발(Model1 방식)이 유행하다 현재는 유지보수단계에서 많은 단점을 느껴 각각의 역할을 나누어 서블릿과 JSP를 동시에 사용하여 개발하는 방식(Model2 방식)으로 개발하고 있어 현재는 Servlet과 JSP를 나누어 사용하고 있다. 그리하여 JSP는 HTML태그 사용이 용이하고 자바코드 사용이 불편하기 때문에 웹어플리케이션에서 사용자에게 결과를 보여주는 View(Client)를 담당하고 Servlet은 자바코드 작성이 편리하기 때문에 주로 화면과 통신하여 자료를 받아 가공하고 가공한 자료를 다시 화면에 전달하는 Controller역할을 하고 있다.

~ JSP와 Servlet 동시에 사용 MVC모델(View는 JSP, Controller는 Servlet을 사용)
~ 프리젠테이션 로직과 비즈니스 로직 분리
(보여지는 부분은 HTML이 중심이 되는 JSP, 다른 자바클래스에게 데이터를 넘겨주는 부분은 Java코드가 중심이 되는 Servlet이 담당)
~ 유지보수 용이 

MVC패턴
Model2
기능
Model
서비스클래스 or 자바빈
~ 비지니스 로직을 처리하는 모든 것이 모델에 속한다. 컨트롤러부터 특정 로직에 대한 처리 요청(게시판 글쓰기, 회원 가입 등)이 들어오면 이를 수행하고 수행 결과를 컨트롤러에 반환한다.
(request 객체나 session객체에 저장하기도 함)
View
JSP페이지
~ 클라이언트에 출력되는 화면을 말한다. 모델1과는 달리 로직 처리를 위한 코드가 내포되어있지 않다. 요청 결과의 출력 뿐만 아니라 컨트롤러에 요청을 보내는 용도로도 사용된다.
(request객체나 session객체에 저장된 정보를 토대로 화면 출력)
Controller
Servlet
~ MVC패턴(Model2)모든 흐름제어츨 맡는다. 브라우저로 요청이 들어오면 어떤 요청이 들어오는지 분석하여 이 요청을 처리하기 위한 모델을 사용하여 처리한다. 사용한 모델로 부터 처리결과를 받으면 추가로 처리하거나 가공해야 할 정보가 있다면 처리 후 request객체나 session객체에 저장하고, View(JSP페이지)를 선택하여 Foward나 redirect하여 클라이언트에 출력한다.
장점
단점
~ 출력을 위한 뷰 코드와 로직처리를 위한 자바코드를 분리하기 때문에 JSP모델1에 비해 코드가 복잡하지 않다.
~ 뷰, 로직처리에 대한 분업이 용이하다.
~ 기능에 따라 분리되어 있기 때문에 유지보수가 용이하다.
~ 구조가 복잡하여 습득이 어렵고 작업량이 많다.
~ Java에 대한 깊은 이해도가 필요하다.

JSP파일은 결국 서블릿으로 변환이 되어 실행된다. JSP파일이 Servlet으로 변환되는 과정은 오직 한번만 일어나므로 같은 페이지에 수많은 사용자의 요청이 있더라도 처리속도는 거의 떨어지지 않게 된다. 만약 JSP페이지의 코딩 내용이 변경된다면 다시 변환 과정을 거친다. 즉 JSP가 서블릿을 기반으로 하고 있기 때문에 JSP의 동작 방식을 이해하기 위해서는 Servlet에 대한 이해도도 필요하다.

 지금까지 JSP와 Servlet에 관하여 알아봤습니다.


+ Recent posts