'분류 전체보기'에 해당되는 글 55건

싱글톤

프로그래밍/Java 2019. 12. 18. 21:48

싱글톤 패턴

싱글톤이란 디자인패턴 중에 하나이다.

객체지향 언어에서는 하나의 객체에 여러개의 인스턴스를 생성할 수 있다.

만약 '회사원' 이라는 객체가 있으면 이것에 대한 인스턴스를 여려명 생성할 수 있는 것이다. 한 회사에 사원은 여러명이다.

그런데 회사는 여러개 있으면 안된다. 뭔가 설명이 애매하긴 하지만, 결국은 여러개의 인스턴스가 생성 되는걸 방지하기 위해 싱글톤 패턴을 사용한다.


Compony 클래스

package designPattern;

public class Compony {

    private int componyCode; // 사번
    private String memberName; // 이름

    private static Compony instance = new Compony();

    private Compony() {}

    public static Compony getInstance() {
        if(instance == null) {
            instance = new Compony();
        }

        return instance;
    }

    public int getComponyCode() {
        return componyCode;
    }

    public void setComponyCode(int componyCode) {
        this.componyCode = componyCode;
    }

    public String getMemberName() {
        return memberName;
    }

    public void setMemberName(String memberName) {
        this.memberName = memberName;
    }


    public void showComponyInfo() {
        System.out.println("componyCode=" + componyCode + ", "+ "memberName=" + memberName);
    }




}
  • 기본 생성자의 접근을 막아버렸다 (private)
  • Compony객체에 대한 인스턴스(주소)를 메모리에 올려버리고 이 객체에 대한 인스턴스는 항상 동일하다.

테스트

package designPattern;

public class ComponyTest {
    public static void main(String[] args) {
        Compony myCompony1 = Compony.getInstance();
        Compony myCompony2  = Compony.getInstance();

        System.out.println(myCompony1 == myCompony2) ; // 이 둘의 주소는 같다.

        myCompony1.setComponyCode(91241231);
        myCompony1.setMemberName("임꺽정");
        myCompony1.showComponyInfo();

        myCompony2.setComponyCode(1241231);
        myCompony2.setMemberName("홍길동");
        myCompony2.showComponyInfo();


        System.out.println("=========================================================");
        myCompony1.showComponyInfo();



    }
}

  • getInstance 메서드가 static 으로 선언되있기에 new 없이 바로 사용할 수 있다.
  • myCompony1 과 myCompony2 는 동일한 인스턴스 주소를 같는다.
  • myCompony1, myCompony2 각각 다르게 변수를 세팅하였다.
  • 그런데 맨 마지막 부분에 myCompony1 의 변수들을 출력하니, myCompony2 에서 세팅한 값들이 출력되었다.
  • 이 이유는 myCompony1 와 myCompony2 는 같은 주소를 가지고 있기에 언제 어디서나 그 값은 제일 마지막에 셋팅한 값이 출력된다.

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

내부 클래스  (0) 2019.12.25
Map  (0) 2019.12.20
Set  (0) 2019.12.17
컬렉션 프레임워크  (0) 2019.12.14
제네릭  (0) 2019.12.14
블로그 이미지

파니동

,

Set

프로그래밍/Java 2019. 12. 17. 00:14

HashSet

해쉬는 순서가 정해져있지 않으며, 중복을 허용하지 않는 것이 특징이다.


HashSetTest

package collection.hashset;

import java.util.HashSet;

public class HashSetTest {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<String>();

        hashSet.add(new String("임정순"));
        hashSet.add(new String("박현정"));
        hashSet.add(new String("홍연의"));
        hashSet.add(new String("강감찬"));
        hashSet.add(new String("강감찬"));

        System.out.println(hashSet);
    }
}

  • 3, 4번째 값이 같으므로, 중복된 값은 출력되지 않는다.

MemberHashSet (MemberArrayList 와 비교)

package collection.hashset;

import java.util.HashSet;
import java.util.Iterator;

import collection.Member;

public class MemberHashSet {
    private HashSet<Member> hashSet;

    public MemberHashSet() {
        hashSet = new HashSet<Member>();
    }

    public void addMember(Member member) {
        hashSet.add(member);
    }

    public boolean removeMember(int memberId) {
        Iterator<Member> ir = hashSet.iterator();

        while(ir.hasNext()) {
            Member member = ir.next();
            int tempId = member.getMemberId();
            if(tempId == memberId) {
                hashSet.remove(member);
                return true;
            }
        }
        System.out.println(memberId + "가 존재하지 않습니다.");        
        return false;
    }

    public void showAllMember() {
        for(Member member : hashSet) {
            System.out.println(member);
        }
        System.out.println();
    }

}
  • 기능은 기존 MemberArrayList와 같다.

테스트

package collection.hashset;

import collection.Member;

public class MemberHashSetTest {

    public static void main(String[] args) {
        MemberHashSet memberHashsSet = new MemberHashSet();

        Member memberLee = new Member(1001, "이지원");
        Member memberSon = new Member(1002, "손민국");
        Member memberPark = new Member(1003, "박서원");

        memberHashsSet.addMember(memberLee);    
        memberHashsSet.addMember(memberSon);    
        memberHashsSet.addMember(memberPark);    

        memberHashsSet.showAllMember(); // 순서대로 들어가지 않음.

        Member memberHong = new Member(1003, "홍길동");
        memberHashsSet.addMember(memberHong);
        memberHashsSet.showAllMember();


    }

}

  • 출력결과를 보면 hashSet은 중복을 허용하지 않는다고 했는데 아이디가 같은 홍길동이 출력 되었다.
  • 객체가 같다는 것은 주소가 같다는 것을 의미하는데 이건 Member 객체가 서로 다른 주소값을 가지고 있기에 서로 다른 값으로 인식하는 것이다.

Member클래스 Object 클래스 메서드 재정의(equals, hashCode)

    @Override
    public int hashCode() {
        return memberId;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member)obj;
            if(this.memberId == member.memberId)
                return true;
            else
                return false;
        }
        return false;
    }

테스트

TreeSet

트리셋은 중복을 허용하지 않으며, 이진트리로 순서를 정렬한다.


TreeSetTest

package collection.treeset;

import java.util.TreeSet;

public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet = new TreeSet<Integer>();
        treeSet.add(432);
        treeSet.add(33);
        treeSet.add(23);
        treeSet.add(1);

        for(Integer i : treeSet) {
            System.out.println(i);
        }
    }
}


MemberTreeSet

package collection.treeset;

import java.util.Iterator;
import java.util.TreeSet;

import collection.Member;

public class MemberTreeSet {
    private TreeSet<Member> treeSet;


    public MemberTreeSet() {
        treeSet = new TreeSet<Member>();
    }

    public void addMember(Member member) {
        treeSet.add(member);
    }

    public boolean removeMember(int memberId) {
        Iterator<Member> ir = treeSet.iterator();

        while(ir.hasNext()) {
            Member member = ir.next();
            int tempId = member.getMemberId();
            if(tempId == memberId) {
                treeSet.remove(member);
                return true;
            }
        }
        System.out.println(memberId + "가 존재하지 않습니다.");        
        return false;
    }

    public void showAllMember() {
        for(Member member : treeSet) {
            System.out.println(member);
        }
        System.out.println();
    }

}
  • 기존 arrayList 와 hashSet과 같은 로직

테스트

  • 수행결과를 보면, Comparable 클래스 구현이 안되어있다고 한다.
  • TreeSet 리스트를 정렬하여 출력해야 하는데, Member객체는 어떤 것으로 정렬을 해야할지 정해지지 않아 생긴 것이다.
  • Integer 와 String 클래스의 경우는 내부적으로 구현되어있지만 사용자 정의 클래스는 개발자가 직접 정렬 기준을 정해줘야 한다.

Member 클래스 Comparable 클래스 구현

package collection;

public class Member implements Comparable<Member> {
    private int memberId;
    private String memberName;

    @Override
    public int hashCode() {
        return memberId;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof Member) {
            Member member = (Member)obj;
            if(this.memberId == member.memberId)
                return true;
            else
                return false;
        }
        return false;
    }

    @Override
    public String toString() {
        return memberName + " 회원님의 아이디는 " + memberId + "입니다.";
    }

    public Member(int memberId, String memberName) {
        this.memberId = memberId;
        this.memberName = memberName;
    }

    public int getMemberId() {
        return memberId;
    }

    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }

    public String getMemberName() {
        return memberName;
    }

    public void setMemberName(String memberName) {
        this.memberName = memberName;
    }

    @Override
    public int compareTo(Member member) {
        return (this.memberId - member.memberId);
//        return (this.memberId - member.memberId) * (-1);         // 오름차순
//        return this.memberName.compareTo(member.memberName);    // 이름으로 정렬

    }

}

 - compareTo 메서드를 재정의하여 정렬 기준을 정한다.


출처: do it 자바프로그래밍

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

Map  (0) 2019.12.20
싱글톤  (0) 2019.12.18
컬렉션 프레임워크  (0) 2019.12.14
제네릭  (0) 2019.12.14
Class 클래스  (0) 2019.12.12
블로그 이미지

파니동

,

리눅스 디렉토리

  • bin: (심볼릭)링크, 바로가기 같은 것. 실행 파일들이 모여있음.
  • boot: 부팅관련 옵션
  • dev: 디바이스의 약자
  • etc: 시스템 설정
  • home: 사용자들 계정들이 모여있는 곳
  • usr: 프로그램 설치 경로
  • root: 관리자 디렉터리

출처: 양주종의 코딩스쿨

블로그 이미지

파니동

,

루트 권한으로 로그인

vi  /etc/bashrc 
  • :se nu (숫자 라인 붙이기)
  • ~ (소문자로 전환)
  • :wq (저장하고 종료)
  • 세션 종료 후 재로그인

디렉토리 이동 시 모든 경로가 보여지게 됨.

출처: 양주종의 코딩스쿨

블로그 이미지

파니동

,

브라우저에서 요청에 대해 서블릿에서 로직 처리 후 다시 브라우저로 되돌리는 과정을 서블릿 response 객체에서 담당한다.

이때, 브라우저에 어떤 타입으로 리턴할 것인가를 지정하는데 이것을 MIME-TYPE 이라고 한다.

바로 전 예제와 같이 아이디와 패스워드를 받아 사용자가 입력한 정보를 출력해주는 서블릿을 작성해보자.


LoginServlet2

package sec02.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet2
 */
@WebServlet("/login2")
public class LoginServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init 메서드 호출");
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("distory 메서드 호출");
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("요청 성공.");

        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8"); // 브라우저에 리턴할 타입을 지정.
        PrintWriter out = response.getWriter();
        String id = request.getParameter("user_id");
        String pw = request.getParameter("user_pw");

        String data = "<html>";
        data += "<body>";
        data += "아이디 : " + id;
        data += "<br>";
        data += "패스워드:" + pw;
        data += "</body>";
        data += "</html>";

        out.print(data);

    }

}

  • Response객체의 getWriter 메서드를 사용해 브라우저에 결과 값을 돌려준다.
  • 직접 html 코딩을 해서 굉장히 불편해보인다.

login2.html - 자바스크립트로 서블릿 요청

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>

<script>
    function fn_vaildate() {
        var frmLogin = document.frmLogin;
        var user_id = frmLogin.user_id.value;
        var user_pw = frmLogin.user_pw.value;

        if(user_id.length == 0 || user_id == '' || user_pw.length == 0 || user_pw == '' ) {
            alert('아이디와 비밀번호는 필수입니다.');
        }else {
            frmLogin.method = 'post';
            frmLogin.action = 'login5';
            frmLogin.submit();
        }
    }

</script>

</head>
<body>
  <form name="frmLogin" method="get" action="login"  encType="UTF-8">
       아이디  :<input type="text" name="user_id"><br>
       비밀번호:<input type="password" name="user_pw" ><br>
       <input type="button" value="로그인" onClick="fn_vaildate()" />  
       <input type="reset" value="다시입력" />
       <input type="hidden" name="user_address" value="서울시 성북구" /> 
  </form>
</body>
</html>
  • html 태그의 form Submit이 아닌 자바스크립트로 유효성 체크 후 서버로 전송.

LoginServlet5

package sec03.ex03;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet5
 */
@WebServlet("/login5")
public class LoginServlet5 extends HttpServlet {

    @Override
    public void init(ServletConfig config) throws ServletException {
    }

    @Override
    public void destroy() {
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        String id = request.getParameter("user_id");
        String pw = request.getParameter("user_pw");
        String adress = request.getParameter("user_address");

        System.out.println("아이디:" + id);
        System.out.println("비밀번호:" + pw);

        String data = new String("");
        data += "<html>";
        data += "<body>";
        data += "아이디:" + id + "<br>";
        data += "패스워드:" + pw + "<br>";
        data += "주소:" + adress;
        data += "</body>";
        data += "</html>";

        out.print(data);

    }

}
  • html 태그 노가다

출처: 자바 웹을 다루는 기술

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿 리다이렉트 와 바인딩  (0) 2019.12.26
서블릿과 DB 연동  (2) 2019.12.19
서블릿 기초 실습  (0) 2019.12.14
서블릿  (0) 2019.12.14
웹 애플리케이션 구동하기  (0) 2019.12.11
블로그 이미지

파니동

,

컬렉션 프레임워크란 자료구조에 대한 API를 JDK에서 미리 구현된 것을 말한다.
컬렉션 프레임워크의 종류는 다양하지만, 대표적으로 List 와 Map이 있다.

우선 List 의 대표적인 클래스인 ArrayList 부터 알아보자.

ArrayList

Member 클래스

package collection;

public class Member {
    private int memberId;
    private String memberName;

    public Member(int memberId, String memberName) {
        this.memberId = memberId;
        this.memberName = memberName;
    }

    public int getMemberId() {
        return memberId;
    }

    public void setMemberId(int memberId) {
        this.memberId = memberId;
    }

    public String getMemberName() {
        return memberName;
    }

    public void setMemberName(String memberName) {
        this.memberName = memberName;
    }

    @Override
    public String toString() {
        return "Member [memberId=" + memberId + ", memberName=" + memberName + "]";
    }

}

MemberArrayList 클래스

package collection.arraylist;

import java.util.ArrayList;

import collection.Member;

public class MemberArrayList {
    private ArrayList<Member> arrayList;

    public MemberArrayList() {
        arrayList = new ArrayList<>();
    }

    public void addMember(Member member) {
        arrayList.add(member);
    }

    public void insertMember(int index, Member member) {
        if(index < 0 || index > arrayList.size()) {
            System.out.println("list의 범위가 아닙니다. ");
            return;
        }

        arrayList.add(index, member);
    }

    public boolean removeMember(int memberId) {

        for (int i=0; i < arrayList.size(); i++) {
            Member member = arrayList.get(i);
            int tempId = member.getMemberId();

            if(tempId == memberId) {
                arrayList.remove(i);
                return true;
             }
        }
        System.out.println(memberId + "가 존재하지 않습니다.");
        return false;
    }


    public void showAllMember() {

        for(Member member : arrayList) { // 향상된 for 문
            System.out.println(member);
        }
        System.out.println();
    }

}
  • 회원을 추가하는 기능을 정의함.

테스트

package collection.arraylist;

import collection.Member;

public class MemberArrayListTest {
    public static void main(String[] args) {
        MemberArrayList memberArrayList = new MemberArrayList();

        Member memberLee = new Member(1001, "이지원");
        Member memberMeng = new Member(1002, "맹꽁이");
        Member memberCloud = new Member(1003, "구르미");
        Member memberYoo = new Member(1004, "유도비");

        // 추가
        Member memberKim = new Member(1000, "김동환");

        memberArrayList.addMember(memberLee);
        memberArrayList.addMember(memberMeng);
        memberArrayList.addMember(memberCloud);
        memberArrayList.addMember(memberYoo);

        memberArrayList.showAllMember();

        System.out.println();

        memberArrayList.insertMember(5, memberKim);
        memberArrayList.showAllMember();



    }
}


LinkedList

package collection;

import java.util.LinkedList;

public class LinkedListTest {
    public static void main(String[] args) {
        LinkedList<String> myList = new LinkedList<String>();

        myList.add("A");
        myList.add("B");
        myList.add("C");

        System.out.println(myList);

        myList.add(1, "D");
        System.out.println(myList);

        myList.addFirst("0");
        System.out.println(myList);

        myList.removeLast();
        System.out.println(myList);


    }
}
  • 리스트의 값의 수정이 용이하다.

스택과 큐

프로그래밍세계에서 자료구조하면 스택과 큐를 언급하지 않을 수 없다.
자료를 저장할 때 위로 쌓으면 스택, 가로로 나열하면 큐이다.

스택은 마지막에 들어온 것이 제일 빨리 나가야한다.
큐는 먼저 들어온게 먼저 나가야한다.


ArayList로 스택을 구현하기.

package collection.arraylist;

import java.util.ArrayList;

class MyStack {
    private ArrayList<String> arrayStack = new ArrayList<>();

    public void push(String data) {
        arrayStack.add(data);
    }

    public String pop() {
        int len = arrayStack.size();
        if(len == 0) {
            System.out.println("스택이 비었습니다.");
            return null;
        }
        return(arrayStack.remove(len-1));
    }

    public int getStackSize() {
        return arrayStack.size();
    }

}

public class StackTest {
    public static void main(String[] args) {
        MyStack stack = new MyStack();
        stack.push("A");
        stack.push("B");
        stack.push("C");

        System.out.println("크기: " + stack.getStackSize());

        System.out.println(stack.pop());
        System.out.println(stack.pop());
        System.out.println(stack.pop());

        System.out.println("크기: " + stack.getStackSize());

    }

}
  • 배열의 크기를 보면 크기가 늘었다가 줄어드는 것을 확인할 수 있다.

iterator 메서드 사용하기

    public boolean removeMember(int memberId) {

//        for (int i=0; i < arrayList.size(); i++) {
//            Member member = arrayList.get(i);
//            int tempId = member.getMemberId();
//            
//            if(tempId == memberId) {
//                arrayList.remove(i);
//                return true;
//             }
//        }

        Iterator<Member> ir = arrayList.iterator();

        while(ir.hasNext()) {
            Member member = ir.next();
            int tempId = member.getMemberId();
            if(tempId == memberId) {
                arrayList.remove(member);
                return true;
            }
        }

        System.out.println(memberId + "가 존재하지 않습니다.");
        return false;
    }

테스트

package collection.arraylist;

import collection.Member;

public class MemberArrayListTest {
    public static void main(String[] args) {
        MemberArrayList memberArrayList = new MemberArrayList();

        Member memberLee = new Member(1001, "이지원");
        Member memberMeng = new Member(1002, "맹꽁이");
        Member memberCloud = new Member(1003, "구르미");
        Member memberYoo = new Member(1004, "유도비");


        memberArrayList.addMember(memberLee);
        memberArrayList.addMember(memberMeng);
        memberArrayList.addMember(memberCloud);
        memberArrayList.addMember(memberYoo);

        System.out.println("===========  삭제전 ================ ");

        memberArrayList.showAllMember();

        System.out.println("===========  삭제 후 ================ ");

        memberArrayList.removeMember(1001); // 이지원 삭제
        memberArrayList.showAllMember();
    }
}

  • iterator는 인덱스를 알 수 없을 때 유용하다.
  • 그리고 구현이 조금더 편리하다.

출처: do it 자바프로그래밍

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

싱글톤  (0) 2019.12.18
Set  (0) 2019.12.17
제네릭  (0) 2019.12.14
Class 클래스  (0) 2019.12.12
wrapper클래스  (0) 2019.12.11
블로그 이미지

파니동

,

제네릭

프로그래밍/Java 2019. 12. 14. 14:35

제네릭은 하나의 변수가 하나의 참조 자료형만 가지는게 아닌, 여러개의 참조자료형을 가질 수 있는 기능 중 하나이다.

만약 3D 프린터로 무언가를 만든다고 했을 때 그 안에 있는 재료는 무엇이든 될 수 있다.
그 재료가 바뀔 때마다 그 재료에 맞는 프린터를 사용하는 것은 비효율적이고, 비용이 많이 든다. 제네릭은 동일한 프린터기에 다른 재료들을 넣어서 생산할 수 있게끔 도와준다.

Powder 클래스

package generics;

public class Powder {
    public void doPrinting() {
        System.out.println("Poder 재료로 출력합니다.");
    }

    @Override
    public String toString() {
        return "재료는 Powder 입니다";
    }

}

Plastic 클래스

package generics;

public class Plastic {
    public void doPrinting() {
        System.out.println("Plastic 재료로 출력합니다.");
    }

    @Override
    public String toString() {
        return "재료는 Plastic 입니다";
    }

}

GenericPrinter

package generics;

public class GenericPrinter<T> {
    private T material;

    public void setMaterial(T material) {
        this.material = material;
    }

    public T getMaterial() {
        return material;
    }

    public String toString() {
        return material.toString();
    }
}
  • 이 3D 프린터기는 어떤 재료로도 제품을 생산할 수 있다.

GenericPrinterTest - 프린트 출력

package generics;

public class GenericPrinterTest {
    public static void main(String[] args) {
        GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();

        powderPrinter.setMaterial(new Powder());
        Powder powder = powderPrinter.getMaterial();
        System.out.println(powderPrinter);

        GenericPrinter<Plastic> plastiPrinter = new GenericPrinter<Plastic>();

        plastiPrinter.setMaterial(new Plastic());
        Plastic plastic = plastiPrinter.getMaterial();
        System.out.println(plastiPrinter);                    


    }
}

  • 각각 플라스틱과, 파우더 재료를 넣어 제품을 생산하였다.

제네릭의 T 자료형 제한.

만약 재료를 넣는데 엉뚱한 재료를 넣는다면, 프린터기가 망가질 수 있다. 그렇기 때문에 제네릭 자료형의 제한을 할 수 있다.

Material 클래스

package generics;

public abstract class Material {
    public abstract void doPrinting();
}

기존재료들은 Material 클래스를 상속받음.

package generics;

public class Powder extends Material {
    public void doPrinting() {
        System.out.println("Poder 재료로 출력합니다.");
    }

    @Override
    public String toString() {
        return "재료는 Powder 입니다";
    }

}
package generics;

public class Plastic extends Material {
    public void doPrinting() {
        System.out.println("Plastic 재료로 출력합니다.");
    }

    @Override
    public String toString() {
        return "재료는 Plastic 입니다";
    }

}

제네릭 클래스에도 Material를 상속받는다.

package generics;

public class GenericPrinter<T extends Material> {
    private T material;

    public void setMaterial(T material) {
        this.material = material;
    }

    public T getMaterial() {
        return material;
    }

    public String toString() {
        return material.toString();
    }

    public void printing() {
        material.doPrinting();
    }
}

테스트

  • Material 클래스를 상속받지 않은 클래스를 제네릭 자료형으로 넘기면 오류가 발생!

  • 이 친구도 상속을 받았다.

  • 이제 오류가 안남.


제네릭 클래스에서 상위 클래스 메서드 사용하기.

GenericPrinter 클래스에 메서드 추가.

테스트

package generics;

public class GenericPrinterTest {
    public static void main(String[] args) {
        GenericPrinter<Powder> powderPrinter = new GenericPrinter<Powder>();

        powderPrinter.setMaterial(new Powder());
        Powder powder = powderPrinter.getMaterial();
//        System.out.println(powderPrinter);
        powderPrinter.printing();

        GenericPrinter<Plastic> plastiPrinter = new GenericPrinter<Plastic>();

        plastiPrinter.setMaterial(new Plastic());
        Plastic plastic = plastiPrinter.getMaterial();
//        System.out.println(plastiPrinter);     
        plastiPrinter.printing();


        // Material 을 상속하지 않은 클래스
        GenericPrinter<Water> water = new GenericPrinter<Water>();        


    }
}


여러개의 제네릭 자료형 받기.

제네릭 클래스

package generics;

public class Point<T, V> {
    T x;
    V y;

    public Point(T x, V y) {
        this.x = x;
        this.y = y;
    }

    public T getX() {
        return x;
    }

    public V getY() {
        return y;
    }


}

제네릭 메서드 구현

package generics;

public class GenericMethod {
    public static <T, V> double makeRectangle(Point<T, V> p1, Point<T, V> p2) {
        double left = ((Number)p1.getX()).doubleValue();   // 0
        double right = ((Number)p2.getX()).doubleValue();  // 10
        double top = ((Number)p1.getY()).doubleValue();    // 0.0
        double bottom = ((Number)p2.getY()).doubleValue(); // 10.0

        double width = right - left; // 10 - 0 = 10
        double height = bottom - top; // 10.0 - 0.0 = 10.0

        return width * height; // 10 * 10.0 = 100.0
    }

    public static void main(String[] args) {
        Point<Integer, Double> p1 = new Point<>(0, 0.0);
        Point<Integer, Double> p2 = new Point<>(10, 10.0);

        double rect = GenericMethod.<Integer, Double>makeRectangle(p1, p2);
        System.out.println("두 점으로 만들어진 사각형의 넓이는 " + rect + "입니다.");
    }
}
  • GenericMethod는 제네릭 클래스가 아니더라도 내부에 있는 제네릭 메서드를 구현할 수 있다.
  • 제네릭 메서드는 static 으로 선언하였다.
  • 제네릭 메서드의 매개변수 들어오는 자료형은 해당 메서드 안에서만 유효범위를 갖는다.



출처: do it 자바프로그래밍

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

Set  (0) 2019.12.17
컬렉션 프레임워크  (0) 2019.12.14
Class 클래스  (0) 2019.12.12
wrapper클래스  (0) 2019.12.11
String 클래스  (0) 2019.12.10
블로그 이미지

파니동

,

LoginServlet 클래스

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("init 메서드 호출");
    }    


    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("아이디:" + user_id);
        System.out.println("비밀번호:" + user_pw);
    }    


    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("destory 메서드 호출.");
    }

}
  • 웹 브라우저 요청을 doGet 메서드에서 파리미터를 받아 처리한다.

login.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>로그인창</title>
</head>
<body>
  <form name="frmLogin" method="get" action="login"  encType="UTF-8">
       아이디  :<input type="text" name="user_id"><br>
       비밀번호:<input type="password" name="user_pw" ><br>
    <input type="submit" value="로그인">  <input type="reset" value="다시입력">
  </form>
</body>
</html>
  • form태그의 action 속성의 값이 서블릿 맵핑 URI 이다.

서블릿에서 다중 파라미터 값 처리하기.

package sec01.ex01;

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class InputServlet
 */
@WebServlet("/input")
public class InputServlet extends HttpServlet {

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String user_id = request.getParameter("user_id");
        String user_pw = request.getParameter("user_pw");
        System.out.println("아이디:" + user_id);
        System.out.println("비밀번호:" + user_pw);

        String[] subject = request.getParameterValues("subject");

        for(String sbj : subject) {
            System.out.println(sbj);
        }

    }

}

input.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>여러 가지 input 타입 표시창</title>
</head>
<body>
<form name="frmInput" method="get" action="input">
   아이디  :<input type="text" name="user_id"><br>
   비밀번호:<input type="password" name="user_pw"><br>
   <input type="checkbox" name="subject" value="java" checked >자바
   <input type="checkbox" name="subject" value="C언어">C언어
   <input type="checkbox" name="subject" value="JSP">JSP
   <input type="checkbox" name="subject" value="안드로이드">안드로이드 
   <br><br>
   <input type="submit" value="전송">   
   <input type="reset" value="초기화">
  </form>
</body>
</html>
  • 셀렉트박스의 파라미터는 하나의 name 에 여러개의 갑이 들어가므로, getParameterValues 메서드로 처리.

여러개의 파라미터 처리하기.

package sec01.ex01;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class InputServlet2
 */
@WebServlet("/input2")
public class InputServlet2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        Enumeration enu = request.getParameterNames();

        while(enu.hasMoreElements()) {
            String name = (String) enu.nextElement();
            String[] values = request.getParameterValues(name);
            for(String value : values) {
                System.out.println("name=" + name + ", value=" + value);
            }
        }
    }

}
  • getParameter() 메서드로 input-name 값을 하나하나 처리하기 번거로우므로, getParameterNames메서드로 넘어온 파라미터들을 한꺼번에 처리한다.

출처: 자바 웹을 다루는 기술.

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
서블릿  (0) 2019.12.14
웹 애플리케이션 구동하기  (0) 2019.12.11
프로그래밍의 발전과정  (0) 2019.12.10
블로그 이미지

파니동

,

서블릿은 웹 브라우저의 요청을 처리하기 위한 java로 구현한 API 이다.

서블릿의 생명주기.

서블릿 클래스가 생성될 때 재정의한 메서드들의 생명주기.

init(): 해당클래스가 생성 될 때 최초 한번 실행 된다.

doGet(), doPost(): 웹 브라우저 요청시 수시로 실행된다.

destory(): 객체가 소멸될 때 실행된다.

Servlet 구현.

1. Servlet-api 설정하기.


2. Servlet API 구현.

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        System.out.println("init 메서드 호출");
    }        

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메서드 호출");
    }

    @Override
    public void destroy() {
        System.out.println("destory 메서드 호출");
    }
}

3. 웹 브라우저 요청 시 서블릿 맵핑하기 - web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <servlet>
        <servlet-name>aaa</servlet-name>
        <servlet-class>sec01.ex01.FirstServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>aaa</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
</web-app>
  • 브라우저에서 요청이 오면 해당 클래스로 맵핑.


4. 서블릿 추가하기.

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SecondServlet extends HttpServlet{

    @Override
    public void init() throws ServletException {
        System.out.println("init 메서드 호출");
    }        

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet 메서드 호출");
    }

    @Override
    public void destroy() {
        System.out.println("destory 메서드 호출");
    }


}
  • 같은 기능의 두번 째 서블릿 클래스를 추가하였다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <servlet>
        <servlet-name>aaa</servlet-name>
        <servlet-class>sec01.ex01.FirstServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>bbb</servlet-name>
        <servlet-class>sec01.ex01.SecondServlet</servlet-class>
    </servlet>    
    <servlet-mapping>
        <servlet-name>aaa</servlet-name>
        <url-pattern>/first</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>aaa</servlet-name>
        <url-pattern>/Second</url-pattern>
    </servlet-mapping>    
</web-app>
  • 새로운 클래스로 서블릿 맵핑 추가.


@어노테이션으로 서블릿 맵핑하기.

web.xml 에 서블릿을 맵핑하는 것은 가독성도 안좋고 불편하다.
톰캣 7이상부터는 어노테이션을 이용한 서블릿 맵핑을 지원한다. 거의 대부분 이렇게 사용한다.


새로운 서블릿 클래스 추가.


어노테이션이 적용된 서블릿 클래스가 생성됨.

package sec01.ex01;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class ThirdServlet
 */
@WebServlet("/Third")
public class ThirdServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see Servlet#init(ServletConfig)
     */
    public void init(ServletConfig config) throws ServletException {
        System.out.println("ThirdServlet init 호출");
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("ThirdServlet doGet");
    }

    /**
     * @see Servlet#destroy()
     */
    public void destroy() {
        System.out.println("ThirdServlet destory 호출");
    }

}

출처: 자바 웹을 다루는 기술.

'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글

서블릿과 DB 연동  (2) 2019.12.19
서블릿 Response객체  (0) 2019.12.15
서블릿 기초 실습  (0) 2019.12.14
웹 애플리케이션 구동하기  (0) 2019.12.11
프로그래밍의 발전과정  (0) 2019.12.10
블로그 이미지

파니동

,

Class는 객체에 대한 정보를 알고자 할 때 사용된다.

Person

package classex;

public class Person {
    private String name;
    private int age;

    public Person() {}

    public Person(String name) {
        this.name = name;
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }        
}
  • 변수 2개, 생성자가 3개인 클래스.

ClassTest

package classex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ClassTest {
    public static void main(String[] args) throws ClassNotFoundException {
        Person person = new Person();
        Class pClass1 = person.getClass();
        System.out.println(pClass1.getName());

        Class pClass2 = Person.class;
        System.out.println(pClass2.getName());

        Class pClass3 = Class.forName("classex.Person");
        System.out.println(pClass3.getName());

    }
}
  • 클래스 정보를 가져올 수 있는 3가지 방법.


클래스 정보를 가져와 새로운 인스턴스 생성하기.

package classex;

public class NewInstance {

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Person person1 = new Person();
        System.out.println(person1);

        Class pClass = Class.forName("classex.Person"); 
        Person person2 = (Person)pClass.newInstance(); // 클래스 정보를 가지고 새로운 인스턴스 생성. 
        System.out.println(person2);
    }

}

  • Class.forName 으로 가져온 클래스 정보로 새로운 인스턴스를 생성할 수 있다.

출처: do it 자바프로그래밍

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

컬렉션 프레임워크  (0) 2019.12.14
제네릭  (0) 2019.12.14
wrapper클래스  (0) 2019.12.11
String 클래스  (0) 2019.12.10
기본클래스 - Object  (0) 2019.12.09
블로그 이미지

파니동

,