처음에 HTTP 통신을 배울 때, POST와 GET의 차이를 배우게 된다. 그리고 그 두METHOD의 차이에 대한 질문이 신입사원 단골 기출 면접 문제로 인터넷 상에 널리 퍼져있다. 실제로 내가 2017년도에 신입사원으로 첫 직장들을 지원했을 때, POST와 GET의 차이에 대한 질문을 여러 번 받아보기도 하였다.

2017년도에서 3년정도 지나, RESTful API가 널리 쓰이고 있는 현재에서는 RESTful API에서 POST와 PUT의 차이가 이제는 그 주요 질문 항목에 들어 갈 수 있을 거 같다.
(2017년도만 해도, 나는 RESTful API의 개념 정도만 들어봤고, 실제는 써본 적이 없었다.)
(그리고 요즘 경력 개발자 채용 공고를 찾아보면, Back-end 개발자 기준으로 RESTful API 에 대한 항목이 대부분 기재되어 있는 것을 보면, RESTful API에 대한 역량이 필수적으로 자리메김한 거 같다.)

이런 이유로 HTTP세계를 넘어 RESTful한 세계에서의 POST와 PUT차이를 알아보고자 한다.

먼저 간단하게, 다들 알고 있는 RESTful API에 대해 간략하게 정리해보자.

🙈 RESTful API란?

자원을 URI로 표현하고, 자원에 대한 행위를 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.

간략하게 말한다면, 위와 같은 스타일을 따르는 API라고 볼 수 있다.

RESTful API에 대해 자세히 말하고자 한다면, 이 페이지로는 모자를 거 같고, 이번 주제가 아니기에 다음에 자세히 다뤄보기로 하겠다.

이제 본래 주제인 RESTful한 세계에서의 POST와 PUT의 차이를 살펴보자.

🔑POST vs PUT

자원에 대한 행위를 나타내는 4가지 Method는 CRUD(Create/Read/Update/Delete)에 각각 매칭된다.

POST는 Create(생성), PUT은 Update(수정)에 매칭되는데, RESTful API는 자원에 대한 행위를 4가지 Method로 표한하니까, 자원에 대한 생성은 POST가 담당하고, 자원에 대한 수정은 PUT이 담당하는 것이다.

보통 이렇게 정의하지만, 나도 이런 정의만 보고 도대체 어떻게 다른지 감을 잡기 힘들었다. 여러분들은 이런 어려움이 없으면 하는 마음에 자세하게 예를 들어 설명해보겠다.

아래와 같은 URI가 있고, 해당 URI에 대해 POST와 PUT이 작동하는 예를 보자.
/student

POST 메소드로 뽀로로라는 이름을 가진 학생을 생성하기 위에 아래와 같이 요청하면, 고유 구분값인 id를 1로 설정되어 뽀로로라는 학생이 생성된다.

HttpRequest
POST /student
{
  “name”: “뽀로로”,
  “grade”: 1
}

HttpResponse
HTTP/1.1 200 OK
{
  “id”: 1,
  “name”: “뽀로로”,
  “grade”: 1
}

그러면 이제, PUT을 통해 뽀로로의 grade를 2를 변경해보자. PUT은 리소스에 대한 수정이므로 특정 리소스를 구분하는 id값을 넣어줘야 한다.

HttpRequest
PUT /student/1
{
  “grade”: 2
}

HttpResponse
HTTP/1.1 200 OK
{
  “id”: 1,
  “name”: “뽀로로”,
  “grade”: 2
}

이는 POST와 PUT의 가장 기본적인 사용예제이고, 두 메서드의 차이를 조금 더 자세히 알아보기 위한 예제를 또 살펴보자.

POST 메서드로 뽀로로 학생을 생성해달라고 2번 요청하면 어떻게 될까?

POST /student
{
   “name”: “뽀로로”,
   “grade”: 1
}

id가 1과 2인 뽀로로가 두 개가 생겨버린다. POST는 리소스를 생성하기 위한 메서드로 요청한 횟수마다 새로운 리소스를 생성한다.
(물론 name을 unique key로 잡으면 같은 이름으로 생성하지 안되게 만들 수는 있다.)

HTTP/1.1 200 OK
{ “id”: 1, “name”: “뽀로로”, “grade”: 1 }

HTTP/1.1 200 OK
{ “id”: 2, “name”: “뽀로로”, “grade”: 1}

반대로 PUT으로 같은 요청을 두번 보내면 어떻게 될까?

PUT /student/3
{
  “name”: ”에디”
  “grade”: 2
}

2번 아니, 수백번 보내도 아래와 같이 같은 응답이 온다. id를 3을 가진 리소스는 없었으므로, 최소 한번은 생성되고, 그 후에는 생성되지 않는다.

HTTP/1.1 200 OK
{ “id”: ”3”, “name”: “에디”, “grade”: 2 }

예시를 들며 설명했던 내용을 다시 정리해보면,

  • POST
    • POST는 리소스의 생성을 담당한다.
    • POST는 요청 시 마다, 새로운 리소스가 생성된다.
  • PUT
    • PUT은 리소스의 생성과 수정을 담당한다.
    • PUT은 요청 시 마다, 같은 리소스를 반환한다
    • 물론, 리소스 안에 속성은 변경될 수 있다.

이를 어려운 말로 이야기하면, PUT은 멱등하다고 말할 수 있고, POST는 멱등하지 않다라고 말한다.

👀그렇다면 PATCH와 PUT은?

PATCH도 수정을 담당하는 메서드라는데, PUT도 수정에 사용되는 거라고 한다. 그렇다면 이 둘은 어떻게 다른 것인가?

PATCH는 수정만 담당하며 리소스의 일부분만 수정할 때 사용하고, PUT은 리소스의 모든 속성을 수정하기 위해 사용한다.

⚰️끝맺으며..

여기까지 RESTful API에서 POST와 PUT이 어떻게 다른지 알아보았고, 추가적으로 PATCH까지 간략하게 살펴보았다. 물론 이 차이가 RESTful API에만 적용되는 것이 아니고, HTTP에서도 적용되는 것을 잊으않았으면 한다. 예를 들어 RESTful API를 통해 설명한 것 뿐이다.

참고 : 1ambda.github.io/javascripts/rest-api-put-vs-post/

Map과 VO

이전까지 사용자의 페이지에서 DB로 전달하거나, DB에서 불러온 데이터를 페이지에 뿌려주기 위해 VO(Value Object)를 사용하였다. 요즘 jsp로 만든 오래된 웹을 분석하고 있는데 VO대신 Map을 이용하여 처리하고 있었다. Map을 쓰는 것과 VO를 쓰는 것 어떤 점이 다른지 살펴보고자 한다.


VO

내가 이전부터 써왔던 VO부터 살펴보자. VO를 쓰면 데이터의 의미를 파악하기 쉽다. 학생정보를 저장하는 프로그램을 만든다고 한다면, 입력받은 학생정보는 VO객체로 만들어져 데이터를 전달할 것이다. StudentVO라는 VO는 변수명만 봐도 그 의미를 확실하게 전달할 수 있고, VO안의 들어갈 데이터의 이름(변수 명)들도 명시하고 있기에 어떤 데이터가 들어있는지도 파악하기 쉽다.
하지만 이렇게 VO를 정의하고 변수명을 정하고 약속하는데 시간이 적지 않게 소요될 수 있기에 작은 프로젝트를 빠르게 구현하기에는 부적합할 수 있다. 하지만 대규모 프로젝트나 끊임없이 업무 정의가 바뀌어가는 프프로젝트에서는 명확한 의미를 보여줌으로써 유지보수하기 쉽게 만들어 줄 것이다.

Map

Map으로 학생정보를 저장하는 프로그램을 만든다면, Map에 학생정보를 저장하고 전달할 것이다. Map에 들어가는 Key는 VO의 변수와 다르게 구현할 때마다 손쉽게 다르게 정의될 수 있다. 이는 작은 프로젝트를 빠르게 구현할 때, 새로운 요구사항을 빠르게 반영할 때 장점이 될 수 있다. 하지만 구현 시 마다 정의함으로 정해져있는 VO객체보다는 의미파악에 있어서 혼돈이 있을 수 있다.

경험

실제로 현재 Map으로 데이터를 전달하는 코드를 분석하면서 Map에 담겨있는 데이터를 제대로 파악하기 힘들어하고 있다. 이것이 크게는 전체 업무 프로세스를 파악하기 힘든 지경에까지 이르러 유지보수에 큰 어려움을 주고 있다. VO를 이용하여 구현하였다면 VO 클래스 안에 모여있는 변수를 파악하면 되었기에 의미 파악하기 쉬웠을 것으로 생각된다.

하지만 프로그래밍에서 가장 좋은 정답은 없고 상황에 맞는 것을 선택하는 것이 중요한 것 같다. 간단하고 유지보수가 앞으로 없을 프로그램에서는 Map을 이용해 빠르게 구현하고, 유지보수가 꾸준히 필요하고 복잡한 프로그램에서는 VO를 통해 데이터의 가시성을 확보하는 것이 필요하다.

자바스크립트를 주석처리하는 이유


홈페이지 코드를 분석하다가 다음과 같이 전체가 주석처리 되어 있는 경우를 만나기도 한다.

<script type="text/javascript"> <!-- function sum1(){     ...... } function sum2(){     ...... } --> </script>

왜 이렇게 주석처리를 해놓는지 궁금했는데, 이번에 알게 되었다.

요즘은 왠만한 웹브라우저들은 js 엔진을 가지고 있지만, 옛날에는 js엔진을 가지고 있지 않은 웹브라우저도 있었다고 한다.

js엔진을 가지고 있지 않은 웹브라우저에서는 자바스크립트 코드를 만나면 오류가 나게 된다. 이를 방지하기 위해 HTML 주석태그로 주석처리하여 js엔진이 없으면 주석으로 인식하여 오류가 나지 않게 하는 것이다.

지금은 왠만한 브라우저들은 js엔진을 갖추고 있기에 이런식으로 처리할 필요는 없다.

ping vs telnet

Ping과 Telnet


네트워크가 살아있는지 체크하기 위해 ping과 telnet을 자주 쓰는데 어떻게 다른지 자세히 살펴보자.


Ping

Ping은 포트를 지정하지 않고 인터넷 연결만 체크한다.
DDOS 공격에 이용되기도 해서 ping을 막기도 한다.

ping 설정 (Window 기준)
Window 방화벽 -> 고급 -> ICMP 설정

ICMP는 호스트 간 메세지를 주고받기 위한 프로토콜로 OSI 7계층 중 3번째 network 계층


Telnet

기본적으로 23번 포트를 사용한다.

특정 서버에서 서비스가 살아있는지 여부를 체크하는 방법으로 사용하고, 평문으로 전달된다. 보통 원격서버와 접속하기 위해 많이 사용된다.

암호화 되지 않은 평문을 그대로 보내기에 보안상 취약점을 가지고 있다.
(중간에서 데이터를 가로채는 네트워크 스니핑을 당할 경우 데이터가 고스란히 노출)

이 때문에 데이터를 암호화해서 보내는 SSH(Secure Shell)이 요즘 많이 쓰인다.


경험

보안이 철저한 네트워크에 접속을 해야하는 일이 있었는데, DB 접속 시 시간이 초과하여 접속이 이루어지지 않은 문제를 겪었다. 이 때, Oralce 내부 문제인지 알고 여러번 지웠다가 깔면서 생고생한 경험이 있었는데, 다른 선배분이 이럴 때는 네트워크 접속이 제대로 이루어지는지 알아보는게 먼저라고 Ping을 이용해 해당 네트워크와 접속을 체크해 보았다. Ping을 통해 네트워크가 연결되지 않음을 확인했고, Oracle 문제가 아니라 내 PC에서의 접속이 서버측 방화벽에서 막히는 것을 알았다. 그래서 방화벽 해지를 요청하여 DB에 접속할 수 있었다.

WHERE절 1=1, 1=2의 의미

WHERE절 1=1, 1=2의 의미


ibatis를 이용한 동적쿼리를 보면 where절에 1=1, 1=2라는 조건이 자주 보인다.

그전에도 가끔 본 조건이지만 쿼리를 제대로 분석해보고자 마음 먹었기에 1=1과 1=2라는 조건을 자세히 살펴보고자 한다.



WHERE 1=1

SELECT *

FROM tb_test

WHERE 1=1

   <isEqual prepand='AND' property='first' compareValue='1'>

   first_col = '1'

   </isEqual>

   <isEqual prepand='AND' property='second' compareVale='2'>

   second_col = '2'

   </isEqual>

ibatis의 을 이용해 파라미터가 특정값이면 조건을 추가시키는 동적쿼리이다. 파라미터의 값이 특정값과 일치하면 where조건이 추가되고 조건이 모두 맞지않으면 전체를 조회하는 쿼리문이다.



만약 여기서 1=1이 없다면?

  SELECT *

  FROM tb_test

  WHERE

이런 쿼리문이 작성될 것이고, ORA-00936이라는 missing expression 에러가 나게될 것이다.

이렇듯 ibatis를 이용해 WHERE절에 조건을 추가할 때 1=1은 유용할 수 있다.



WHERE 1=2

이번에 WHERE절에 1=2가 어떻게 쓰이는지 살표보자

SELECT *

FROM tb_test

WHERE 1=1

	<isEqual prepand='AND' property='first' compareValue='1'>

        1=2
        </isEqual>

        <isEqual prepand='AND' property='second compareValue='2'>
        second_col = '2'
        </isEqual>

이 동적쿼리문은 first값이 1로 들어오면

(생략)

WHERE 1=1 AND 1=2

이런 조건으로 쿼리문이 실행되면서 false이므로 아무것도 조회하지 못하게 됩니다.

1=2를 이용하면 특정 값을 전달 받을 때, 아무 결과도 가져오지 못하게 할 수 있습니다.



무조건 좋기만 할까?

하지만 이런 1=1을 남발하는 것은 특히 UPDATE, INSERT, DELETE와 같은 데이터의

입출력을 가능케하는 문장에서는 위험할 수 있다.

DELETE FROM tb_test

WHERE 1=1

	<isEqual prepand='AND' property='first' compareValue='1'>

	first_col = '1'

        </isEqual>

이 동적쿼리에 first값이 1로 넘어온다면,

DELETE FROM tb_tes

WHERE 1=1

테이블의 모든 데이터가 삭제될 것이다.

그렇기에 1=1, 1=2를 INSERT, DELETE, UPDATE 등에 쓸 때는 한 번 더 생각해보는 것이 중요한 것 같다.

하지만 ibatis말고 mybatis를 쓴다면 <WHERE> 라는 태그를 이용해 동적쿼리가
반환하는 조건이 있다면 첫 번쨰 리턴된 조건의 AND나 OR를 자동으로 trim하여 쿼리문을 동작하게 할 수 있다.


참고 : http://jdm.kr/blog/7

'SQL' 카테고리의 다른 글

JOIN에서 ON절과 WHERE절의 차이  (0) 2017.08.16

JOIN에서 ON절과 WHERE절의 차이

 

같은 조건이라도 JOIN할 때 ON절에 조건을 넣을 때와 WHERE절에 조건을 넣을 때

쿼리 결과는 다르다. 어떻게 다른지 두 테이블을 살펴보자.

 

1) SELECT *

    FROM employee a

    LEFT OUTER JOIN department b

    ON a.department_no = b.department_no

    WHERE b.location = 'korea';

 

2) SELECT *

    FROM employee a

    LEFT OUTER JOIN department b

    ON a.department_no = b.department_no

       AND b.location = 'korea';

 

1)의 경우에는 employee테이블과 department 테이블이 outer join을 한 후

location이 korea인 값들만 추출한다.

 

2)의 경우에는 department 테이블에서 location이 korea인 값만 employee 테이블과 조인한다.

 

따라서 결과는

1)에는 location이 korea인 값만 존재하지만

2)에서는 location이 korea가 아닌 값도 존재하게된다.

 

 

employee 테이블                                  

employee_id 

 department_no

 1000

 10

 1001

 10

 1002

 20

 

 

department 테이블

 department_no

location 

 10

 korea

 20

 usa

 

 

1)    1000, 10, korea

       1001, 10, korea

 

2)    1000, 10, korea

       1001, 10, korea

       1002, 20, null

 

 

 

2)의 쿼리를 풀어서 다른 방식으로 써보면

 

3) SELECT *

    FROM employee a

    LEFT OUTER JOIN ( SELECT *

                              FROM department

                              where location = 'korea' ) b

    ON a.department_no = b.department_no;

 

3)과 같다.

 

출처 : http://blog.leocat.kr/notes/2017/07/28/sql-join-on-vs-where

*해당 출처를 참고하여 작성한 글입니다.

'SQL' 카테고리의 다른 글

[SQL]ibatis에서 where 1=1과 1=2  (0) 2017.08.20

HttpClient를 이용해 GET request 보내기


Apache HttpClient를 이용하면 간편하게 HTTP request를 보낼 수 있습니다.

간혹 웹 서버를 만들면서 다른 서버로 보터 request를 보내 response 받아 데이터를 처리해야

할 때가 있는데 이 때 HttpClient를 이용하면 간단하게 구현 가능합니다.



Mavan을 이용한 dependency 설정


<dependency>
	<groupId>org.apache.httpcomponents</groupId>
	<artifactId>httpclient</artifactId>
	<version>4.4</version>
</dependency>


*Maven과 같은 빌드툴 이용하지 않는다면 https://hc.apache.org/downloads.cgi을 통해 직접 jar파일을 다운 후 

빌드 패스에 추가해주시면 됩니다.



Dependency 설정을 하셨다면 이제 어떤 순서대로 코딩할지 살펴보겠습니다.


1. ClosableHttpClient 인스턴스를 생성

2. HTTP request type에 따른 HttpGet/HttpPost 인스턴스 생성

3. addHeader 메서드를 이용해 헤더정보 추가

4. request를 execute해서 CloseableHttpResponse 얻기

5. response 출력

6. close 메서드를 통해 연결 종료




1. ClosableHttpClient 인스턴스 생성

1
2
3
4
5
6
7
8
9
10
11
public class Httpclient1 {
    
    private static final String USER_AGENT = "Mozila/5.0";
    private static final String GET_URL = "http://www.google.com";    
 
    public static void sendGet() throws ClientProtocolException, IOException {
        
        //http client 생성
        CloseableHttpClient httpClient = HttpClients.createDefault();
    }
}
cs


2. HTTP request type에 따른 HttpGet/HttpPost 인스턴스 생성


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Httpclient1 {
    
    private static final String USER_AGENT = "Mozila/5.0";
    private static final String GET_URL = "http://www.google.com";    
 
    public static void sendGet() throws ClientProtocolException, IOException {
        
        //http client 생성
        CloseableHttpClient httpClient = HttpClients.createDefault();
 
        //get 메서드와 URL 설정
        HttpGet httpGet = new HttpGet(GET_URL);
    }
}
cs



3. addHeader 메서드를 이용해 헤더정보 추가


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Httpclient1 {
    
    private static final String USER_AGENT = "Mozila/5.0";
    private static final String GET_URL = "http://www.google.com";    
 
    public static void sendGet() throws ClientProtocolException, IOException {
        
        //http client 생성
        CloseableHttpClient httpClient = HttpClients.createDefault();
 
        //get 메서드와 URL 설정
        HttpGet httpGet = new HttpGet(GET_URL);
 
        //agent 정보 설정
        httpGet.addHeader("User-Agent", USER_AGENT);
    }
}
cs



여기까지 했으면 이제는 excute메서드를 통해 request를 보내주고 받은 응답을 처리하면 됩니다.


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
public class Httpclient1 {
    
    private static final String USER_AGENT = "Mozila/5.0";
    private static final String GET_URL = "http://www.google.com";    
 
    public static void sendGet() throws ClientProtocolException, IOException {
        
        //http client 생성
        CloseableHttpClient httpClient = HttpClients.createDefault();
 
        //get 메서드와 URL 설정
        HttpGet httpGet = new HttpGet(GET_URL);
 
        //agent 정보 설정
        httpGet.addHeader("User-Agent", USER_AGENT);
        
        //get 요청
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        
        System.out.println("::GET Response Status::");
        
        //response의 status 코드 출력
        System.out.println(httpResponse.getStatusLine().getStatusCode());
 
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                httpResponse.getEntity().getContent()));
 
        String inputLine;
        StringBuffer response = new StringBuffer();
 
        while ((inputLine = reader.readLine()) != null) {
            response.append(inputLine);
        }
        
        reader.close();
 
        //Print result
        System.out.println(response.toString());
        httpClient.close();
    }
}
cs



실행결과




*json 데이터를 GET request를 통해 받아와야 하는 경우가 많습니다.

그 때에는 Header 정보인 Content-type에 'application/json'을 추가하고 요청을 보내면 됩니다.


예제코드

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
import java.io.IOException;
 
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
 
public class httpclient2 {
    
    private static final String USER_AGENT = "Mozila/5.0";
    private static final String GET_URL = "https://blockchain.info/ko"
            + "/rawblock/0000000000000bae09a7a393a8acd"
            + "ed75aa67e46cb81f7acaa5ad94f9eacd103";
    
    public static void sendGet() throws ClientProtocolException, IOException {
        
        //http client 생성
        CloseableHttpClient httpClient = HttpClients.createDefault();
        
        //get 메서드와 URL 설정
        HttpGet httpGet = new HttpGet(GET_URL);
        
        //agent 정보 설정
        httpGet.addHeader("User-Agent", USER_AGENT);
        httpGet.addHeader("Content-type""application/json");
        
        //get 요청
        CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
        
        System.out.println("GET Response Status");
        System.out.println(httpResponse.getStatusLine().getStatusCode());
        String json = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
        
        System.out.println(json);
        
        httpClient.close();
    }
}
cs


실행결과



참고 : http://www.journaldev.com/7146/apache-httpclient-example-closeablehttpclient

'Java' 카테고리의 다른 글

오버로딩 vs 오버라이딩  (0) 2017.05.16
JAVA 특징와 OOP  (0) 2017.05.12
[Reflect]Refletion의 정의와 동적 메소드 호출  (0) 2017.03.17
[Collection] 동기화된 컬렉션  (0) 2017.03.10
[람다식]메소드와 생성자 참조  (0) 2017.03.08

Http Requset와 Response 구조



1. Request 구조

리퀘스트행 : 메소드, URL, HTTP 버전으로 정보가 표시, 위에는 get메서드로 /member/login.do url을 요청한것

헤더 : 메타정보가 담겨져 있다.




2. Response 구조



상태행 : http 버전, 상태코드, 설명문으로 표시, 상태코드는 서버의 결과를 숫자로 나타낸 것

오버라이딩과 오버로딩


오버로딩와 오버라이딩 모두 자바에서 다형성을 지원하는 방법


오버라이딩


흔히, 재정의라고 불린다.

상속관계에서 하위클래스가 상위 클래스의 맴버로 포함된 메서드를 재정의하여 쓰는 것

메서드의 이름은 같지만 안의 구현부만 다르다.


오버로딩


오버로딩의 종류로는 생성자 오버로딩, 메서드 오버로딩이 있다.

메서드의 이름은 같지만 파라미터 타입, 개수에 따라 여러 메서드를 정의하는 것을 말한다.



예제 코드)




Pen.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package co.kr.javastudy.override;
 
public class Pen {
    
    public String maker;
    public int price;
        
    //생성자 오버로딩
    //01.인자를 하나만 같는 생성자
    Pen(String maker) {
        this.maker = maker;
    }
    
    //02. 인자를 두개 같는 생성자
    Pen(String maker, int price) {
        this(maker);
        this.price = price;
    }
    
    public void write() {
        System.out.println("펜을 쓰다");
    }
}
cs



RedPen.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package co.kr.javastudy.override;
 
public class RedPen extends Pen{
    
    public String color = "red";
    
    RedPen(String maker) {
        super(maker);
    }
    
    @Override
    public void write() {
        System.out.println("빨간 펜으로 쓴다.");
    }
    
    //메서드 오버로딩
    //메서드 이름은 같지만 파라미터가 달라서 가능!
    public void write(String place) {
        System.out.println(place + "에 빨칸펜으로 쓴다");
    }
}
cs



main.java


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package co.kr.javastudy.override;
 
public class main {
    public static void main(String[] args) {
        
        //생성자 오버로딩
        //생성자 오버로딩을 이용해 다양한 파라미터를 전달하여 객체 생성 가능
        Pen pen = new Pen("모나미"200);
        Pen pen2 = new Pen("BIC");
        
        RedPen pen3 = new RedPen("제브라");
        
        
        //메서드 오버로딩 실행 예
        pen3.write("스케치북");
        pen3.write();
        
    }
}
cs



실행결과


JAVA 소개


미국의 선마이크로시스템즈가 개발한 객체 지향 프로그래밍 언어


특징


1. JRE이 설치되어 있으면 컴퓨터와 운영체제 상관없이 작동 - 운영체제에 독립적

2. 기본 자료형 이외에 모든 요소들이 객체로 표현

3. 캡슐화, 상속, 다형성이 잘 적용된 언어

4. GC(garbage collector)를 통한 자동 메모리 관리

5. 멀티 쓰레드 지원



객체지향프로그래밍(OOP)의 특징


1. 추상화

공통의 속성이나 기능을 묶어 이름을 붙이는 것

클래스를 정의하는 것 자체가 추상화라고 볼 수 있음


2. 캡슐화

데이터 구조와 데이터를 다루는 방법을 묶는 것

클래스 내부를 외부에서는 볼 수 없도록 하는 것 - 은닉화


3. 상속성

상위 클래스를 하위 클래스가 물려받는 것

상속을 이용해 재사용성을 증대시킬 수 있다.


4. 다형성

같은 메세지에 따라 클래스가 다른 행위를 하게 하는 것

이름은 같지만 파라미터에 따라 다른 동작을 하는 메소드들을 만듬

+ Recent posts