Search

반응형

'Java'에 해당되는 글 53건

  1. 2021.10.17 [스프링 왕초보]2. Spring boot IDE 설치해보기. 2/2(스프링 부트)
  2. 2021.08.15 [Java]추상클래스(Abstract Class) 와 인터페이스(Interface) 쉽게 이해하기.
반응형

 스프링 왕초보 1.에서 스프링 부트 환경을 위해 필요한 openJDK 설치를 해봤는데..

이제 Spring.io에 가서 IDE를 설치해봐야겠다.

이클립스에서 STS를 다운받아 설치는 했지만

이번에는 Spring에서 제공하는 IDE를 설치해볼것이다.

이 IDE도 이클립스 기반이다.

먼저 Spring.io에 접속하자.

 

눈에 Download가 바로 보이지 않는군.

그래서 상단에 있는 메뉴 중 Projects를 선택하면 하단에 DEVELOPMENT TOOLS가 보이네.

내가 원하는 Spring Tools 4가 있군..클릭~

이클립스 기반, Visual Studio Code 기반, Theia 기반으로 구분되어 있네.

이클립스 기반에 Windows 버전으로 다운받아야겠군.

총 540M정도 되네...

 

다운이 완료되었다.

그런데 JAR 파일이네..

openJDK가 설치되어 있으면 더블클릭시 실행된다.

실행되면 아래와 같이 같은 공간에 IDE 폴더가 생성되는군.

폴더에 들어가보면 다음과 같은 구성이 되어 있군.

저기 아래 초록색 동그라미 아이콘에 SpringToolSuite4가 실행파일 같은데..

우선 폴더를 복사해서 C 아래로 이동시키자.

더블클릭 시도!~

오 실행이 되는군~.

C 드라이브에 sbWorkspace 폴더를 생성하고 Workspace를 설정하자.

다음 Launch를 클릭해서 실행하자.

이클립스네.

이렇게 실행바가 나타나고 실행이 된다.

최초 실행화면이다.

이클립스네..ㅎㅎ

이제 스프링 부트(Spring boot) 설치 했으니 

 HelloWorld! 를 출력해서 잘 설치되었는지 구동 방식도 확인해보자.

 

좌측 상단에 있는 Create new Spring Starter Project를 클릭하자.

이런 창이 나타난다.

겁먹지 말고 하나씩 시작하자.

먼저 Name이 Demo인데 바꾸자.

MyHello로 변경한다.

이름은 변경했고 다음은 뭘까?

Type이 있는데..

Maven Project 와 Gradle Project가 있군.

요즘은 Gradle이 유명하다니 이걸로 선택!.

packaging은 Jar와 War가 있는데 Jar로 선택.

버전은 openJDK가 11이니 11로.

마지막 package는 myhello로 지정하고 Next를 클릭하니.

이런게 나타난다.

뭐 엄청 많은 내용들이 왼쪽에 보이지만 필요한 부분만 잘 선택하면 되겠지.

Developer Tools는 개발용 부트 툴이니 전부 선택하고

제일 마지막의 Web에서 Spring Web을 추가해준다.

우선 이정도만 가지고 진행을 해보자.

Finish를 누르고 나면 아래와 같이 구성된다.

스프링 부트(Spring boot)는 간단하게 실행해서 테스트 할 수 있도록 톰캣이 내장되어 있다고 했다.

그러면 테스트를 해봐야겠군.

우선 톰캣을 따로 설정하지 않았고

내장되어 있다고 하니 실행을 먼저 해봐야겠다.

프로젝트에 우측 클릭을 하고 Run As를 선택하면 5 Spring Boot App이 보인다.

클릭해보자.

실행을 하니 콘솔에 로그에 대한 정보가 떴다.

사이즈를 늘려달라는 의미인 듯 하다.

Console buffer size가 80,000인데 1,000,000으로 늘려보자.

실행을 하면 우측 하단의 Console에 아래와 같이 로그가 생성된다.

중간쯤 Tomcat이란 글자가 보이는 거 보니 정말 톰캣이 있나보다.

이제 실행이 잘 되었는지 브라우저를 통해서 확인해보자.

크롬을 사용해서 localhost:8080으로 접근을 시도하니 위 페이지가 뜨네.

뭔가 부족해 보이는 듯 하다.

에러페이지니깐~

하지만 아직 HelloWorld를 출력하는 소스를 코딩하지 않았고

톰캣 구동 후 저렇게 뜨는건 정상이다. 쫄지 말자!!

 

이제 코딩을 시작해보자.

MVC 모델이니 컨트롤러를 구성해보자.

src/main/java에서 myhello를 구성했다.

그 하위 패키지에 controller 패키지를 구성하고 MyController.java를 생성하자.

마우스 우측 클릭을 해서 package와 Class를 선택해서 생성하면 된다.

웹으로 호출하기 위해 해당 controller는 @RestController로 어노테이션을 설정한다.

빨간 X표가 나오면 import 시켜주면 된다.

그리고 @RequestMapping("/myHello") 어노테이션으로 호출 경로를 지정하고

해당 페이지에 return 값을 넘겨준다.

그리고 localhost:8080/myHello를 다시 입력해보자.

이렇게 출력되면 성공~!

다들 고생했다.

이제 JDK와 IDE 설정이 기본으로 끝났다.

이제 본격적으로 spring에 대해 공부를 하나씩 차근차근 해보자!!

반응형
반응형

안녕하세요. 신기한 연구소입니다.

최근에 프로젝트를 마치고 잠시 휴가를 즐기고 있습니다.

자바스크립트(javascript)를 공부하던 중 갑자기 자바의 인터페이스와 추상클래스가 떠오르더군요.

생각난 김에 정리를 해야겠어서 이렇게 포스팅해봅니다.

다양한 책을 읽어보면 추상클래스와 인터페이스에 대한 설명이 되어 있습니다.

두 개념을 비교하면서 설명을 하고 있는데요.

좀 더 이해하기 쉽게 설명해보겠습니다.

이번 포스팅은 코딩 없이 설명만 하겠습니다.

 

게임 캐릭터를 만든다고 생각해봅시다.

어떤 종족을 구현한다고 가정해보고 시작해봅니다.

그 종족은 모두 이마에 같은 종족 이니셜이 있다고 설계했습니다.

같은 종족들은 다양한 캐릭터가 있겠지만

공통된 부분은 바로 이마의 이니셜입니다.

종족은 몇 가지의 종류로 구성되며 추후 더 추가될 가능성도 있습니다.

각 캐릭터별 객체를 만들기 위해 클래스를 설계하는데요.

무조건 이마에 같은 이니셜이 있음을 빼먹으면 안 됩니다.

공통이라고 볼 수 있겠네요.

그래서 그 공통된 부분을 추상화해서 추상 클래스의 메서드로 구현해 둡니다.

방금 설명한 대로 추상 클래스는 각 캐릭터의 클래스의 공통된 부분을 추출해서

구현한 클래스이기에 이에 해당하는 객체는 없는 게 맞겠지요?

그래서 추상 클래스는 객체를 만들 수 없다기 보단 만들 필요가 없게 됩니다.

보통 책들을 보면 추상 클래스는 객체를 만들 수 없다,

구현되지 않은 추상 메서드로 인해 객체를 만들 수 없다고 하는데요.

신기한 연구소에서는 객체를 만들 필요가 없는 공통을 정의한 클래스라고 하겠습니다.

 

그런데 같은 종족을 대표하는 추상 클래스를 구성하고 이 클래스를 상속받아서

각 캐릭터 클래스를 설계할 건데요.

완벽하게 일치하는 기능인 경우는 상속받아서 활용하면 되지만

같은 행위지만 다른 방식이라면 모두 다른 메서드를 구성해야 합니다.

그럼 안 되겠지요?

이런 경우는 같은 행위에 대해 정의만 하고 상속받은 캐릭터 클래스에서

각자의 특성에 맞는 방식을 구현하게 하면 됩니다.

바로 추상 메서드라고 합니다.

추상클래스에서 메서드에 abstract를 붙이고 구현하지 않으면

상속받은 캐릭터별 클래스에서 해당 메서드를 

오버라이드(override)해서 각 캐릭터에 맞게 구현하면 된답니다.

예를 들어 공격, 이동, 방어 등이 있겠네요.

캐릭터별로 공격이라는 행위는 있지만

공격하는 방법(방식)은 다를 수 있기 때문이지요.

 

추상클래스(abstract class)에 대해 정리해 보겠습니다.

클래스를 설계하는 과정 중에 각 클래스들의 공통부분을 추출해서

상위 클래스로 구성하고 같은 기능, 방식이면 구현해서 사용할 수 있게 하고

같은 행위지만 방법(방식)이 다르면 추상 메서드로 정의만 해서

반드시 빼먹지 말고 구현할 수 있게 만든 클래스라 보면 되겠네요.

 

그럼 인터페이스는 무엇일까요?

어쨌든 이름도 확연하게 다르네요. ㅎㅎ

 

추상클래스는 클래스입니다.

그래서 클래스를 설계하는 과정에서 추상화하는 과정에서 생성된다고 보면 되는데...

인터페이스도 abstract라는 키워드를 사용해서 상수 또는 메서드를 정의만 합니다. 

인터페이스는 용어의 의미대로 겉으로 드러낸 기능이라고 보면 되겠네요.

클래스가 설계된 후 정리가 되었다면

게임을 시작하면 캐릭터들이 생성되는데요.

캐릭터 클래스를 가지고 각 캐릭터들을 객체로 인스턴스화 하면 된답니다.

이제 이 인스턴스들을 사용자들이 조작을 해야 합니다.

어떤 기능이 있는지 알아야겠지요?

그래서 클래스로 만들어진 객체(인스턴스)들이 어떤 기능을 활용할 수 있는지

그 부분을 정의한 것이 인터페이스라고 보면 됩니다.

 

각 캐릭터별로 보면

전진, 후진, 공격, 방어 등 다양한 기능들이 있는데요

이런 기능들을 빠트리지 않고 구현할 수 있도록

캐릭터들의 기능들을 구현하도록 정의한 것이 인터페이스입니다.

무조건 구현을 해야 하기에 설계를 잘해야겠지요?

또한 종족별로 초기 에너지, 공격 지수 등을 할당받아야 할 수 있습니다.

그런 부분 또한 인터페이스에서 abstract 상수로 정의해서 사용하면 

캐릭터를 생성할 때 누락되는 상황이 없겠지요?

 

모든 종족은 생명유지, 에너지 보충이라는 기능이 있다고 치면

그 부분에 대해 인터페이스를 구성하고

각 종족별 인터페이스와 모든 종족의 인터페이스를

동시에 구현하던지 상속 후 구현하는 방식으로 활용할 수 있겠습니다.

 

추상 클래스와 인터페이스는 사용법이 전혀 다릅니다.

클래스를 설계하면서 공통부분을 정리하기 위해 추상 클래스를 사용하는 것이며,

설계된 클래스를 이용해서 객체를 생성한 뒤

해당 객체를 사용할 수 있는 기능들을 정리한 것이 인터페이스라고 생각하면 됩니다.

 

사용자가 사용할 필요 없는 클래스끼리 구성되기 위해 사용하는 메서드가 있다고 칩시다.

객체의 타입과 생성자를 해당 클래스로 지정해서 생성할 경우,

사용자가 굳이 사용할 필요 없는 메서드까지 노출되고

사용자는 혼란스러워 할 수 있는 상황이 발생할 수 있습니다.

이런 경우는 사용자만을 위한 메서드를 정의한 인터페이스를

객체의 타입으로 지정하고 해당 객체의 생성자로 인스턴스화 한다면

사용자는 불필요한 메서드를 볼 수도 없고 혼란에 빠질 일도 없을 겁니다.

이제 인터페이스와 추상 클래스에 대해 어느 정도 정리가 되었을 거라 생각됩니다.

 

Map<String, Object> hm = new HashMap<String, Object>();

 

HashMap 클래스로 객체를 생성할 때 Map이라는 인터페이스의 타입으로 생성하고

Map에 정의된 인터페이스의 메서드만 활용한다는 의미입니다.

반응형