반응형

 

bin/www

bin/www 파일은 http 모듈에 express 모듈을 연결하고 포트를 지정하는 부분.

 

// app, debug, http 모듈들을 가져옵니다.
// debug 모듈은 콘솔에 로그를 남기는 모듈입니다.
var app = require('../app');
var debug = require('debug')('ex-test:server');
var http = require('http');

var port = normalizePort(process.env.PORT || '3000');

// 서버가 실행될 port를 설정합니다.
// 기본값으로 3000번 포트를 이용하도록 되어있다.
// app.set('key', 'value') 로 값을 저장할 수 있다.
app.set('port', port); 

var server = http.createServer(app);

// port를 연결하고 서버를 실행한다.
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);

 

app.js

중간의 미들웨어를 거쳐 클라이언트의 요청을 받아 처리한 후, 다시 클라이언트에게 응답한다.

 

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

// express 패키지를 호출해 app 변수 객체를 만들었다. 각종 기능을 연결하는 변수.
var app = express(); 

// view engine setup
// express 앱 설정 부분
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// app.use로 미들웨어를 연결하는 부분이다.
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

참고서적 조현영 「Node.js 교과서」 길벗(2018) p188~192

반응형

 

Express-generator 전역 설치하기

$ npm i -g express-generator

 

 

원하는 폴더로 이동 후 패키지 생성. ejs 를 사용하겠습니다.

express [ 사용할 패키지 이름 ] --view=ejs

 

$ express ex_test --view=ejs

 

 

* 설치중에 보안 오류: (:) [], PSSecurityException... FullyQualifiedErrorId : UnauthorizedAccess 같은 문구가 뜰 때 조치법

 

윈도우 powershell 관리자 권한 실행 ==> set-executionpolicy unrestricted 입력 ==> executionpolicy 명령어로 Unrestricted 출력되면 성공 ( 스크립트 허용 )

 

 

$ npm i 까지 해주면 모듈까지 설치 완료.

 

$ npm start => http://localhost:3000

 

 

익스프레스 접속 성공.

반응형

 

npm

Node Package Manager로써 node의 특정 기능을 하는 패키지가 60만개이상 등록되어있다.

 

package.json

설치한 패키지의 버전을 관리하는 파일로써 프로젝트를 시작하기 전에 만드는 것이 좋다.

 

시작하려는 폴더에서 터미널에 $npm init 입력

 

다음과 같이 진행을하면 package.json 파일이 만들어집니다.

 

 

아래의 dependencies 부분에는 제가 따로 설치한 express의 버전 정보가 나와있습니다.

$ npm install express  명령을 통해 설치했습니다.

 

이와같이 package.json 파일을 통해 설치한 패키지들을 손쉽게 관리할 수 있습니다. 감사합니다.

반응형

# Template Literal

 

기존의 큰따옴표나 작은따옴표로 감싸는 문자열과는 다르게 백틱(')으로 감싼다.

백틱( ` )은 문자 리터럴로 화면에 보이는대로 출력하고 작은따옴표( ' )는 문자를 코드로 인식한다.

1
2
3
4
5
6
7
8
9
var name = 'HELLO';
var letter = `aaaaaaaaaaaaaaaaaaaaaaaaa  ${name}
 
 
bbbbbbb         ccccccccccc
`;
 
 
console.log(letter);
cs

 

백틱(`)안의 문자열은 줄바꿈이나 스페이스바 입력까지 그대로 출력된다.

 

 

반응형

 

매핑

색인 시 데이터가 어디에 어떻게 저장될지를 결정하는 설정이다.

데이터베이스의 스키마에 대응하는 개념이라고도 할 수 있고 인덱스에 추가되는 각 데이터 타입을 구체적으로 정의하는 일이다.

엘라스틱서치는 기본적으로 스키마리스이기 때문에 명시적으로 필드를 정의하지 않아도 데이터 유형에 따라 필드 데이터 타입에 대한 매핑 정보가 자동으로 생성된다.

이러한 자동 매핑방식이 편리해 보이지만 실수로 잘못된 타입이 지정될 경우 수정할 방법이 없기 때문에 주의해야한다.

 

아래에서 매핑 인덱스 생성과 필드 데이터 타입을 함께 알아보겠습니다.

 

필드 데이터 타입

# keyword, text 같은 문자열 데이터 타입

# date, long, double, integer, boolean, ip 같은 일반적인 데이터 타입

# 객체 또는 중첩문과 같은 JSON 계층의 특성의 데이터 타입

# geo_point, geo_shape 같은 특수한 데이터 타입

 

# Keyword

키워드 형태로 사용할 데이터에 적합한 데이터 타입.

검색 시 필터링되는 항목 , 정렬이 필요한 항목, 집계 해야하는 항목 에 많이 사용된다.

별도의 분석기를 거치지 않고 원문 그대로 색인하기 때문에 특정 코드나 키워드 등 정형화된 컨텐츠에 주로 사용된다.

만약 elastic search 라는 문자열이 keyword 타입으로 설정되면 elastic이나 search라는 질의로는 절대 검색되지 않는다.

정확히 elastic search라고 질의해야함.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "multiMovieYn" : {
      "type" : "keyword"
    }
  }
}
cs

# Text

색인 시 지정된 분석기가 컬럼의 데이터를 문자열 데이터로 인식하고 이를 분석한다.

Text 타입으로 데이터를 색인하면 전체 텍스트가 토큰화되어 생성되며 특정 단어를 검색하는 것이 가능해진다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "movieComment" : {
      "type" : "text"
    }
  }
}
cs

# Array

영화 데이터에 subtitleLang 필드가 있고 해당 필드에는 개봉 영화의 언어 코드 데이터가 들어있다고 가정해보자.

언어의 값으로 영어(en)와 한국어(ko)라는 두 개의 데이터를 입력하고 싶을 경우 Array 데이터 타입을 사용해야 한다.

문자열이나 숫자처럼 일반적인 값을 지정할 수도 있지만 객체 형태로도 정의할 수 있다.

Array 타입에 저장되는 값은 모두 같은 타입으로만 구성해야 한다.

 

1
2
3
4
5
PUT movie_search/_doc/1
{
 "title" : "해리포터와 마법사의 돌",
 "subtitleLang" : ["ko", "en"]
}
cs

# Numeric 

색인과 검색을 효율적으로 처리하기위한 데이터의 크기에 알맞은 다양한 타입이 제공된다.

long 최솟값과 최댓값을 가지는 부호 있는 64비트 정수. -2^63 ~ 2^63-1
integer 최솟값과 최댓값을 가지는 부호 있는 32비트 정수. -2^31 ~ 2^31-1
short 최솟값과 최댓값을 가지는 부호 있는 16비트 정수. -32768 ~ 32767
byte 최솟값과 최댓값을 가지는 부호 있는 8비트 정수. -128 ~ 127
double 64비트 부동 소수점을 갖는 수
float 32비트 부동 소수점을 갖는 수
half_float 16비트 부동 소수점을 갖는 수

 

 

# Date

Date 타입은 JSON 포맷에서 문자열로 처리된다.

날짜는 다양하게 표현될 수 있기 때문에 올바르게 구문 분석될 수 있게 날짜 문자열 형식을 명시적으로 설정해야한다.

별도의 형식을 지정하지 않을 경우 기본 형식인 “yyyy-MM-ddTHH:mm:ssZ”로 지정된다.

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
 "properties" : {
   "date" : {
     "type" : "date", "format" : "yyyy-MM-dd HH:mm:ss"
   }
 }
}
cs

# Range 

범위가 있는 데이터를 저장할 때 사용하는 데이터 타입이다.

데이터의 시작과 끝만 지정한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "showRange" : {
      "type" : "date_range"
    }
  }
}
 
PUT movie_search/_doc/2
{
  "showRange" : {
    "gte" : "2001-01-01",
    "lte" : "2001-12-31"
  }
}
cs

 

# Boolean

 

1
2
3
4
5
6
7
8
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "check" : {
      "type" : "boolean"
    }
  }
}
cs

 

# Geo-Point 

위도, 경도 등 위치 정보를 담은 데이터를 저장할 때 사용할 수 있는 타입이다.

위치기반 데이터를 색인하고 검색하는 데 매우 유용하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "filmLocation" : {
      "type" : "geo_point"
    }
  }
}
 
PUT movie_search/_doc/3
{
  "title" : "해리포터와 마법사의 돌",
  "filmLocation" : {
    "lat" : 55.415555,
    "lon" : -1.3333
  }
}
cs

# IP

IP 주소와 같은 데이터를 저장하는 데 사용한다. IPv4IPv6를 모두 지정 가능.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "ipAddr" : {
      "type" : "ip"
    }
  }
}
 
PUT movie_search/_doc/4
{
  "ipAddr" : "127.0.0.1"
}
cs

# Object

JSON 포맷의 문서는 내부 객체를 계층적으로 포함할 수 있다.

문서의 필드는 단순히 값을 가질 수도 있지만 복잡한 형태의 또 다른 문서를 포함하는 것도 가능하다.

이처럼 값으로 문서를 가지는 필드의 데이터 타입을 Object 데이터 타입이라고 한다.

Object 데이터 타입을 정의할 때는 다른 데이터 타입과 같이 특정 키워드를 이용하지 않고 단지 필드값으로 다른 문서의 구조를 입력한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies" : {
      "properties" : {
        "companyName" : {
          "type" : "text"
        }
      }
    }
  }
}
 
PUT movie_search/_doc/5
{
  "title" : "반지의 제왕",
  "companies" : {
    "companyName" : "워너브라더스"
  }
}
cs

# Nested

Object 객체 배열을 독립적으로 색인하고 질의하는 형태의 데이터 타입이다.

필드에 객체가 배열 형태로 저장 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#인덱스 생성
PUT movie_search/_mapping/_doc
{
  "properties" : {
    "companies_nested" : {
      "type" : "nested"
    }
  }
}
 
#데이터 색인
PUT movie_search/_doc/8
{
  "title" : "해리포터와 마법사의 돌",
  "companies_nested" : [
    {
      "companyCd" : "1",
      "companyName" : "워너브라더스"
    },{
      "companyCd" : "2",
      "companyName" : "Hello films"
    }
    ]
}
#검색
POST movie_search/_search
{
  "query": {
    "nested": {
      "path": "companies_nested",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "companies_nested.companyName": "워너브라더스"}
              },
              {
                "match" : {
                  "companies_nested.companyCd" : "1"
                }
              }
          ]
        }
      }
    }
  }
}
cs

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p61~97

반응형

 

안녕들 하시죠!

이번시간에는 Elasticsearch에 대해 알아보겠습니다.

 

Elasticsearch

아파치 루씬을 기반으로 한 대표적인 검색엔진이다.

Java로 개발되었으며 역색인과 분산처리 등 기존 검색 기능의 한계를 극복하여 현재 다수의 기업에서 활용하려는 시도를 많이 하고있다.

 

검색 서비스 > 검색 시스템 > 검색 엔진

 

# 검색 엔진

광활한 웹에서 정보를 수집해 검색 결과를 제공하는 프로그램이다. (Elasticsearch)

 

 

# 검색 시스템  

대용량 데이터를 기반으로 신뢰성 있는 검색 결과를 제공하기 위해 검색엔진을 기반으로 구축된 시스템을 통칭하는 용어이다.

수집기를 이용해 방대한 데이터를 수집하고 이를 다수의 검색엔진을 이용해 색인하고 검색 결과를 UI로 제공한다.

 

# 검색 서비스

검색엔진을 기반으로 구축한 검색 시스템을 활용해 검색 결과를 서비스로 제공한다.

 

검색시스템의 구성요소

 

# 수집기

웹사이트, 블로그, 카페 등 웹에서 필요한 정보를 수집하는 프로그램이다.

 

# 스토리지

DB에서 데이터를 저장하는 물리적인 저장소.

검색엔진은 색인한 데이터를 스토리지에 보관한다.

 

# 색인기

검색엔진이 수집한 정보에서 사용자 질의와 일치하는 정보를 찾으려면 수집된 데이터를 검색 가능한 구조로 가공하고 저장해야한다. 그 역할을 하는 것이 색인기다.

색인기는 다양한 형태소 분석기를 조합해 정보에서 의미가 있는 용어를 추출하고 검색에 유리한 역색인 구조로 데이터를 저장한다.

 

# 검색기

검색기는 사용자 질의를 입력받아 색인기에서 저장한 역색인 구조에서 일치하는 문서를 찾아 결과로 반환한다.

질의와 문서가 일치하는지는 유사도 기반의 검색 순위 알고리즘으로 판단한다.

검색기 또한 색인기와 마찬가지로 형태소 분석기를 사용해 사용자 질의에서 유의미한 용어를 추출해 검색한다.

따라서 사용하는 형태소 분석기에 따라 품질이 달라진다.

 

 

 

 

엘라스틱서치와 관계형 데이터베이스 비교
엘라스틱서치 관계형 데이터베이스
index database
shard partition
type table
document row
field column
mapping schema
Query DSL SQL

 

추가, 검색, 삭제, 수정 기능 비교

엘라스틱서치에서 사용하는 HTTP 메서드

기능 데이터베이스 질의 문법
GET 데이터 조회 SELECT
PUT 데이터 생성 INSERT
POST 인덱스 업데이트, 데이터 조회 UPDATE, SELECT
DELETE 데이터 삭제 DELETE
HEAD 인덱스의 정보 확인 -
엘라스틱서치 장점

 

# 엘라스틱서치는 유연하다

역색인되는 문자열 전체를 정책에 따라 소문자 혹은 대문자로 생성하고 쿼리가 들어오는 필터를 색인 시간과 검색 시간에 동일하게 지정한다면 해당하는 쿼리에 어떠한 문자열이 들어와도 검색이 가능해진다.

 

# 구조화되지 않은 비정형 데이터도 검색이 가능하다.

 

# 오픈소스 검색엔진

루씬 기반으로 개발된 오픈소스 검색엔진, 버그의 빠른 수정.

 

# 전문 검색 (Full Text) 검색이 가능하다.

내용 전체를 색인해서 특정 단어가 포함된 문서를 검색한다.

 

# 통계 분석

비정형 로그 데이터를 수집하고 한곳에 모아 통계분석이 가능하고 키바나를 통해 신시간으로 쌓이는 로그를 시각화하고 분석할 수 있다.

 

# 스키마리스

정형화되지 않은 다양한 형태의 문서도 자동으로 색인하고 검색할 수 있다.

 

# RESTful API

HTTP 기반의 RESTful API를 지원하기 떄문에 요청뿐 아니라 응답에도 JSON 형식을 사용해 플랫폼에 종속되지 않고 사용이 가능하다.

  

# 멀티테넌시

서로 상이한 인덱스일지라도 검색할 필드명만 같으면 여러 개의 인덱스를 한번에 조회할 수 있다.

 

# Document-Oriented

여러 계층의 데이터를 JSON 형식의 구조화된 문서로 인덱스에 저장할 수 있다.

계층 구조로 문서도 한번의 쿼리로 쉽게 조회할 수 있다.

 

# 역색인

예를 들어 검색엔진이란 단어가 포함된 모든 문서를 찾아야 한다고 하자.

일반적으로는 처음부터 끝까지 모든 문서를 읽어야만 원하는 결과를 얻을 수 있다.

하지만 역색인 구조는 해당 단어만 찾으면 단어가 포함된 모든 문서의 위치를 알 수 있기 때문에 빠르게 찾을 수 있다.

 

# 확장성과 가용성

엘라스틱서치를 분산 구성해서 확장한다면 대량의 문서를 좀 더 효율적으로 처리할 수 있다.

분산환경에서 데이터는 샤드라는 작은 단위로 나뉘어 제공되며, 인덱스를 만들 때마다 샤드의 수를 조절할 수 있다.

이를 통해 데이터의 종류와 성격에 따라 데이터를 분산해서 빠르게 처리가 가능하다.

 

엘라스틱서치 단점

# 준 실시간

내부적으로 커밋과 플러시 같은 복잡한 과정 때문에 1초정도의 딜레이가 있다.

 

# 트랜잭션과 롤백 기능을 제공하지 않는다.

 

# 데이터의 업데이트를 제공하지 않는다.

데이터의 업데이트 명령이 요청될 경우 기존 문서를 삭제하고 변경된 내용으로 새로운 문서를 생성하는 방식을 이용한다.

비용이 많이 들지만 => 불변적이라는 이점을 취할 수 있다.

 

참고서적 권택환 외 5명 「엘라스틱서치 실무 가이드」 위키북스(2019) p1~10

 

오늘은 여기까지입니다 감사합니다.

반응형

안녕들 하시죠!

이번시간에는 Bootstrap 사용법에 대해 알아보겠습니다.

 

1. Bootstrap 라이브러리 다운

 

Bootstrap 공식 홈페이지에 가면 다운받을 수 있습니다.

http://bootstrapk.com/getting-started/

아래에 파일을 첨부했고, 저는 3.3.2 버전을 사용했습니다.

bootstrap-3.3.2-dist.zip
0.25MB
bootstrap-4.3.1-dist.zip
0.68MB

2. eclipse에 Bootstrap 라이브러리 폴더 만들기

 

WebContent 밑에 resources라는 폴더를 만들고 라이브러리를 압축 풀어 드래그해 넣었습니다.

3. Bootstrap 샘플 얻기

 

여러 사이트가 있지만 저는 https://www.bootdey.com/ 에서 샘플을 찾아보았습니다.

원하는 샘플을 찾아 클릭해 들어갑니다.

저는 개인프로필 샘플을 찾아들어갔습니다.

https://www.bootdey.com/snippets/view/gray-profile

 

 

 

4. HTML code 복사

 

원하는 .jsp나 .html 파일에 HTML code를 복사해 <body>태그 안에 붙여넣기 합니다.

 

5. CSS 파일 만들기

CSS code 부분 복사 -> 아까 만들어 둔 eclipse의 resources 폴더의 css 폴더에 .css 파일을 하나 만들기 -> 붙여넣기.

 

6. Bootstrap CDN 추가

 

HTML code를 복사 붙여넣기 했던 페이지에 CDN 코드 추가.

<link rel="stylesheet" href="resources/css/bootstrap.css">
<!-- CSS code를 복사해 붙여넣은 PersonInfo, 본인 파일명과 root를 작성해주세요 --!>
<link rel="stylesheet" href="resources/css/PersonInfo.css"> 
<script src="resources/js/bootstrap.js"></script>

7. 결과화면

 

 

오늘은 여기까지입니다.

궁금한점 있으시면 댓글이나 쪽지 부탁드려요 감사합니다.

반응형

안녕들 하시죠 !

이번시간에는 프로그래머스 Level2에 있는 '가장 큰 수' (정렬) 문제를 풀어보겠습니다.

 

문제

0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.

예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.

0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.

제한 사항

  • numbers의 길이는 1 이상 100,000 이하입니다.
  • numbers의 원소는 0 이상 1,000 이하입니다.
  • 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

입출력 예                                                      

numbers return
[6, 10, 2] 6210
[3, 30, 34, 5, 9] 9534330

 

코드설명

- 숫자를 String 형으로 변환

1
2
3
4
5
6
7
// 숫자를 String 문자형으로 바꾸기 위해 strNumbers 라는 String형 배열 준비.
String[] strNumbers = new String[numbers.length]; 
 
// String형 배열 strNumbers에 valueOf 메소드를 사용해 숫자를 문자로 바꿔 저장.  
for (int i = 0; i < numbers.length; i++) {
    strNumbers[i] = String.valueOf(numbers[i]);
cs

* valueOf() 메소드

인자에 들어있는 객체를 String 객체로 형 변환시켜주는 메소드.

1
2
3
4
String number = "1234567890"
String sNumbers = String.valueOf(number);
String tbool = String.valueOf(true);
String fbool = String.valueOf(false);
cs

 

- Arrays API를 사용해 정렬

1
2
3
4
5
6
7
8
9
// 컬렉션 프레임워크 Arrays 클래스의 sort 메소드사용.
// Comparator 메서드를 사용해 객체간의 특정한 정렬을 한다.
// compare() 메서드를 오버라이딩해서 숫자간 비교.
Arrays.sort(strNumbers, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
    return (o2 + o1).compareTo(o1 + o2);
    }
});
cs

 

- 예외 처리

1
2
3
4
// 맨 처음 문자가 0이면 0반환
if (strNumbers[0].equals("0")) {
    return "0";
}
cs

- 순차적으로 저장 후 return

1
2
3
4
5
6
// String strNumber에 순차적으로 저장해 answer로 return 
String answer = "";
for (String strNumber : strNumbers) {
    answer += strNumber;
}
return answer;
cs

 

 

전체 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.util.Arrays;
import java.util.Comparator;
 
public class Solution {
 
    public String solution(int[] numbers) {
        // 숫자를 String 문자형으로 바꾸기 위해 strNumbers 라는 String형 배열 준비.
        String[] strNumbers = new String[numbers.length];
 
        // String형 배열 strNumbers에 valueOf 메소드를 사용해 숫자를 문자로 바꿔 저장.
        for (int i = 0; i < numbers.length; i++) {
            strNumbers[i] = String.valueOf(numbers[i]);
        }
 
        // 컬렉션 프레임워크 Arrays 클래스의 sort 메소드사용.
        // Comparator 메서드를 사용해 객체간의 특정한 정렬을 한다.
        // compare() 메서드를 오버라이딩해서 숫자간 비교.
        Arrays.sort(strNumbers, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return (o2 + o1).compareTo(o1 + o2);
            }
        });
 
        // 맨 처음 문자가 0이면 0반환
        if (strNumbers[0].equals("0")) {
            return "0";
        }
 
        // String strNumber에 순차적으로 저장해 answer로 return
        String answer = "";
        for (String strNumber : strNumbers) {
            answer += strNumber;
        }
 
        return answer;
 
    }
 
    public static void main(String[] args) {
        Solution s = new Solution();
        int number[] = { 6102 };
        int number2[] = { 3303459 };
        System.out.println(s.solution(number));
        System.out.println(s.solution(number2));
    }
}
cs

 

오늘은 여기까지입니다 감사합니다.

'Java' 카테고리의 다른 글

Java의 Math 클래스  (0) 2019.05.17
Java의 문자열 분리 (StringTokenizer)  (0) 2019.05.16
Java의 == 연산자와 equals 메소드  (0) 2019.05.13
Java의 추상 클래스  (0) 2019.05.11
Java의 생성자  (0) 2019.04.29

+ Recent posts