728x90

 

 

HashSet

Set에서 가장 많이 사용

순서x 중복x

 

LinkedHashSet

순서o

 

TreeSet

정렬 o

 

        // add(E e):boolean
        // addAll(Collection<? extends E> c) : boolean
        HashSet<Dog> hSet = new HashSet<Dog>();
        HashSet<Dog> hSet2 = new HashSet<>(); // 타입추론

        hSet.add(new Dog("aa",10));
        hSet.add(new Dog("bb",10));
        System.out.println(hSet);   // [aa 10.0kg, bb 10.0kg]

        hSet2.add(new Dog("ㄷ",0));
        // addAll도 맨 앞에 추가함
        hSet2.addAll(hSet);
        System.out.println(hSet2); // [aa 10.0kg, bb 10.0kg, ㄷ 0.0kg]

        // add(Object e):boolean
        // 순서x 중복x HashSet, add하면 어디에 추가될까?
        // 맨 앞에 추가됨
        hSet2.add(new Dog("ㄷ",0));
        System.out.println(hSet2); // [aa 10.0kg, bb 10.0kg, ㄷ 0.0kg]
        // set 중복 저장안되는데 중복 저장 되는 이유 : equals() 오버라이딩 안되어있어서

        HashSet<String> set = new HashSet<>();
        set.add("!");
        set.add("!!");
        set.add("!!");
        System.out.println(set); // [!!, !]   <- set 순서x 중복x

        // LinkedHashSet
        // 순서o 중복저장x 안되는 컬렉션
        LinkedHashSet<Dog> linkSet = new LinkedHashSet<>();
        linkSet.add(new Dog("가",0));
        linkSet.add(new Dog("나",0));
        System.out.println(linkSet); // [가 0.0kg, 나 0.0kg]
        linkSet.add(new Dog("ㄱ",0));
        linkSet.add(new Dog("A",-1));
        System.out.println(linkSet); // [가 0.0kg, 나 0.0kg, ㄱ 0.0kg, A -1.0kg] <- 순서유지



        // 중복 저장이 안된 이유?
        // Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
        // 이 때문에 같은 객체로 인지되었기 때문
        linkSet.add(new Dog("A",-1));
        System.out.println(linkSet); // [가 0.0kg, 나 0.0kg, ㄱ 0.0kg, A -1.0kg]
        System.out.println(linkSet); // [가 0.0kg, 나 0.0kg, ㄱ 0.0kg, A -1.0kg, A -1.0kg]


        // HashSet<String>
        // equals() 오버라이딩 필요x
        // equals() 메소드 주석처리함
        HashSet<String> sSet = new HashSet<String>();
        HashSet<String> sSet2 = new HashSet<>();

        sSet.add("set은");
        sSet.add(" key저장");
        sSet2.addAll(sSet);
        System.out.println(sSet2); // [ key저장, set은]
        sSet2.add("map은 key&value저장");
        System.out.println(sSet2); // [map은 key&value저장,  key저장, set은]
        sSet2.clear();
        System.out.println(sSet2); // []
        sSet.remove("set은");
        System.out.println(sSet); // [ key저장]
        System.out.println(sSet.remove(" key저장")); // true
        System.out.println(sSet); // []

        sSet.add("a");

        // TreeSet
        // 정렬을 해주는 Set
        TreeSet<String> tSet = new TreeSet<>();
        tSet.add("ㄴ");
        tSet.add("ㄱ");
        tSet.add("ㄷ");
        System.out.println(tSet); // [ㄱ, ㄴ, ㄷ] <- 추가 순서랑 다르게 sorting 되서 저장됨

        tSet.add("ㄷ");
        System.out.println(tSet); // [ㄱ, ㄴ, ㄷ] <- 중복x 정렬o
728x90
반응형
728x90

 

단축 명령어

sout : System.out.println()

main : 메인메소드 생성

 

vo class toString(), equals(), hashCode() 쓸 때, 자동으로 코드 만들어준다

 

 

   인텔리제이 단축키 익히기

Ctrl + Q : 도큐먼트를 조회
Ctrl + P : 메서드의 파라미터 정보를 조회
Ctrl + O : Override 가능한 메서드 목록을 확인하여 코드를 자동 생성
Ctrl + I : Implement 가능한 메서드 목록을 확인하여 코드를 자동 생성

Ctrl + Shift + / : 블록 단위로 주석 처리(* *로 주석치리)
Alt + Enter : 추가되지 않은 Import 추가

Ctrl + Alt + D : 커서가 위치한 라인
을 복사하여 바로 밑에 라인에 붙여넣기
Ctrl + d : 커서가 위치한 라인을 삭제

alt + shift + 방향키 : 라인 이동

 

라인 삭제나 런 같은 것들은 몸에 익은 단축키들로 추가하거나 변경했다

 

 

단축키 변경 & 추가하기

File tab - Settings - KeyMap으로 가서 원하는 단축키를 찾으면 된다

검색도 되니 예측되는 단어를 검색해서 찾기도 가능

 

 

728x90
반응형
728x90

Set

순서x 중복저장x
key로 저장
key에 null 저장불가능

HashSet

대표적인 set

 



LinkedHashSet

순서 o 중복저장x
순서 유지되고 중복저장 안되는 컬렉션
중복 저장이 안된 이유?
Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
이 때문에 같은 객체로 인지되었기 때문

TreeSet

정렬을 해주는 Set
오름차순 정렬
   정렬 기준을 세워주는 건 <String>
   String 클래스 안에 comparable 인터페이스가(compareTo())가
   구현 되어있기 때문에 정렬 기준이 정해져 있고, 정렬 기준이 정해져 있는
   클래스 String이 TreeSet 안에 들어가 있기 때문에 정렬 가능

 

HashSet<String>은 객체도 받음

<-> ArrayList<String>은 에러났었음

HashSet hashSet = new HashSet<String>();

HashSet<String> hSet = new HashSet<>();
        hSet.add("가가");
        // addAll
        hashSet.addAll(hSet);
        System.out.println(hashSet); // [가, 가가, 나]  <- 순서xxx 기억할 것
        // HashSet<String>은 객체도 받음
        //      <-> ArrayList<String>은 에러났었음
        hashSet.add(new Dog("다",10)); // [가, 다 10.0kg, 가가, 나]



순서x 중복x HashSet, add하면 어디에 추가될까?

맨 앞에 추가됨

        // 순서x 중복x HashSet, add하면 어디에 추가될까?
        // 맨 앞에 추가됨
        set1.add(new Dog("d",10)); // [d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]
        System.out.println(set1);
        set1.add(new Dog("e",10));
        System.out.println(set1); // [e 10.0kg, d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]


순서o LinkedHashSet, add하면 어디에 추가될까?

마지막에 추가됨

linkedHashSet.add(new Dog("ㄱ",10));
System.out.println(linkedHashSet);  // [ㄱ 10.0kg]
linkedHashSet.add(new Dog("ㄴ",10));
System.out.println(linkedHashSet); // [ㄱ 10.0kg, ㄴ 10.0kg]
linkedHashSet.add(new Dog("ㄷ",10));
System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg]

 

 

 

전체 코드

Set
순서x 중복저장x
key로 저장
key에 null 저장불가능

HashSet

LinkedHashSet
순서 o 중복저장x
순서 유지되고 중복저장 안되는 컬렉션
중복 저장이 안된 이유?
Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
이 때문에 같은 객체로 인지되었기 때문


TreeSet
정렬을 해주는 Set
오름차순 정렬
   정렬 기준을 세워주는 건 <String>
   String 클래스 안에 comparable 인터페이스가(compareTo())가
   구현 되어있기 때문에 정렬 기준이 정해져 있고, 정렬 기준이 정해져 있는
   클래스 String이 TreeSet 안에 들어가 있기 때문에 정렬 가능


순서x 중복x HashSet, add하면 어디에 추가될까?
맨 앞에 추가됨
순서o LinkedHashSet, add하면 어디에 추가될까?
마지막에 추가됨

 

 

 

 

 public void method01() {
        HashSet set0 = new HashSet();
        HashSet<Dog> set1 = new HashSet<>(); // 뒤 제네릭 생략 → 타입추론 : 뒤 생략가능하다는 의미


        // add(E e):boolean
        set1.add(new Dog("a",10));
        set1.add(new Dog("b",10));

        System.out.println(set1);   // [b 10.0kg, a 10.0kg]

        // set 중복 저장안되는데 중복 저장 되는 이유 : equals() 오버라이딩 안되어있어서
        set1.add(new Dog("a",10));
        System.out.println(set1);   // [b 10.0kg, a 10.0kg, a 10.0kg]

        // add(Object e):boolean
        Dog puppy = new Dog("c",10);
        set1.add(puppy);
        System.out.println(set1);   // [c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]
        // 순서x 중복x HashSet, add하면 어디에 추가될까?
        // 맨 앞에 추가됨
        set1.add(new Dog("d",10)); // [d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]
        System.out.println(set1);
        set1.add(new Dog("e",10));
        System.out.println(set1); // [e 10.0kg, d 10.0kg, c 10.0kg, b 10.0kg, a 10.0kg, a 10.0kg]


        // LinkedHashSet
        // 순서 o 중복저장x
        // 순서 유지되고 중복저장 안되는 컬렉션
        // 중복 저장이 안된 이유?
        // Dog클래스에 equals()를 오버라이딩 해줬기 때문에 내용비교가 가능하게 되었고
        // 이 때문에 같은 객체로 인지되었기 때문
        LinkedHashSet<Dog> linkedHashSet = new LinkedHashSet<>();
        linkedHashSet.add(new Dog("ㄱ",10));
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg]



        // 순서o LinkedHashSet, add하면 어디에 추가될까?
        // 마지막에 추가됨
        linkedHashSet.add(new Dog("ㄴ",10));
        System.out.println(linkedHashSet); // [ㄱ 10.0kg, ㄴ 10.0kg]
        linkedHashSet.add(new Dog("ㄷ",10));
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg]
        linkedHashSet.add(new Dog("ㄷ",10));
        // equals() 주석 처리후에는 중복가능해짐
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg, ㄷ 10.0kg]
        // equals() 주석 풀고 난 후에는 중복x
        System.out.println(linkedHashSet);  // [ㄱ 10.0kg, ㄴ 10.0kg, ㄷ 10.0kg]


        // HashSet<String>
        // equals() 오버라이딩 필요x
        HashSet hashSet = new HashSet<String>();
        // equals() 메소드 주석처리함

        hashSet.add("가");
        hashSet.add("나");
        System.out.println(hashSet);    // [가, 나]
        HashSet<String> hSet = new HashSet<>();
        hSet.add("가가");
        // addAll
        hashSet.addAll(hSet);
        System.out.println(hashSet); // [가, 가가, 나]  <- 순서xxx 기억할 것
        // HashSet<String>은 객체도 받음
        //      <-> ArrayList<String>은 에러났었음
        hashSet.add(new Dog("다",10)); // [가, 다 10.0kg, 가가, 나]
        hashSet.add("나나");
        System.out.println(hashSet); // [가, 다 10.0kg, 가가, 나나, 나]
        // 순서 없어서 가운데에도 추가되고 앞에 추가되기도 하고...
        hashSet.remove(new Dog("다",10));
        System.out.println(hashSet); // [가, 가가, 나나, 나]

        // TreeSet
        // 정렬을 해주는 Set
        // 오름차순 정렬
        TreeSet<String> treeSet = new TreeSet<>();
        treeSet.add("아");
        treeSet.add("이");
        treeSet.add("우");

        System.out.println(treeSet); // [아, 우, 이]
        treeSet.addAll(hashSet);
        System.out.println(treeSet); // [가, 가가, 나, 나나, 아, 우, 이]



        // 전체데이터 넣는 방법
        // 1) addAll()
        // 2) 생성자 매개변수 이용

    }

 

728x90
반응형
728x90

 

인텔리제이로 코딩 첫시작!

시작할려고 할 때 아직은 익숙치 않아서 하나는 이클립스 하나는 인텔리제이 켜서

보는건 이클립스로 쓰는건 인텔리제이로 했는데 인텔리제이가 자꾸 꺼져서

둘 다로 바꿨다. 처음에 왠일인지 인텔리제이에서 이클립스에서 쓴 코드들을 런하지 못해서 난감해서 헤맸었다

 

아래는 인텔리제이로 코딩 첫시작한 파일

 

인텔리제이에서 이클립스 파일을 읽어오면

같은 파일들이 bin, src 폴더 두개 다에 있는데

bin은 파란색으로 정상 뜨는데 src는 빨간색으로 들어온다

빨간불인 src는 런 할수 있는 옵션조차 없고 파란불인 bin도 런 옵션은 있지만 에러 발생한다

(bin의 런 실행은 인텔리제이 자체에서 프로젝트로 만들면 문제 없이 되는 것까지 확인해서 지금 그렇게 하고 있다)

 

런 실행 옵션 자체가 없고 아이콘이 다르다
런 옵션도 있고 아이콘을 보면 파일을 잘 읽어온 듯 하다

 

bin폴더에서 보면 이클립스에서 쓴 주석이 안보이고 코드도 인텔리제이가 recreated 했다고 쓰여있으며

실제로 vo 클래스의 코드 형태가 변해있다

이클립스 원래 코드 형태

 

 

src & bin 뭐가 다를까

src는 .java의 소스파일이 있는 곳이며, 개발자가 읽는 코드가 있음
bin은 .class의 binary파일이 있으며, 자바가상머신(JVM)용 코드가 있음

 

 

 

728x90
반응형
728x90

 

 

인텔리제이에서 자동 생성해주는 코드도 만들어보고

vo class의 toString이나 세터,게터, 생성자 코드들도 알아서 recreate해줘서

가로로 쓰는 것도 알았다. 코드 형태가 생소해서 눈에 잘 안들어오긴 했지만 왜 인텔리제이들로 하는지 좀 이해가 되어간다

hashCode()는 아직 수학적인 계산이나 그런 것 때문에 좀 멀리 있는 느낌이고 equals()는 obj 비교하는 이유랑 getClass도 대강 감은 잡은 것 같다

 

package com.prac01.collection.set.model.vo;

public class Dog {

    // default constructor
    private String name;
    private double weight;

    public Dog() {}
    public Dog(String name, double weight){
        this.name = name;
        this.weight = weight;
    }

    
    // getter & setter
    public void setName(String name){
        this.name= name;
    }
    public String getName(){
        return name;
    }
    public void setWeight(double weight){
        this.weight = weight;
    }
    public double getWeight(){
        return weight;
    }

    // toString
    @Override
    public String toString(){
        return name + " " + weight+"kg";
    }

    // equals()
    public boolean equals(Object obj){

        // 1.클래스 비교
        if(this == obj){
            return true;
        }
        if(obj == null){
            return false;
        }

        if(getClass() != obj.getClass()){
            return false;
        }


        // 2.내용 비교
        Dog other = (Dog)obj; // (Dog) 다운캐스팅
        if(name == null){
            if(other.name != null){
                return false;
            }
        }else if(!name.equals(other.name)){
            return false;
        }

        if(weight != other.weight){
            return false;
        }
        return true;
    }


    @Override
    public int hashCode() {
        final int PRIME = 31; // 컴퓨터가 이해하기 좋은 숫자가 31이라함
        int result = 1;

        result = PRIME * result + (name == null ? 0 : name.hashCode()); // 내 해쉬코드가 아니라 스트링의 해쉬코드를 가져오는 것
        result = PRIME * result + (int)weight; // 형이 안맞아서 에러나니 캐스팅 또는 소수점 없게끔 계산

        return result;
    }


//    @Override
//    public boolean equals(Object obj) {
//        return super.equals(obj);
//    }
//
//    @Override
//    public String toString() {
//        return super.toString();
//    }


}

 

 

728x90
반응형
728x90

ajax(jQuery) 댓글 파트

쓴 댓글 쓴거 db 저장하고

또 쓴 댓그 내용 읽어오기

 

오랫만에 써서 로직 파악도 시간이 좀 걸렸고

그래서 글써서 등록하는 부분에서 내용 가져오고 

var rContent 변수에 넣고, 어떤 게시글에 댓글 다는지 알려주고 저장해야하니 boardId도 같이 컨트롤러에 보내줘서 댓글 등록하고

댓글 읽어오는게 좀 복잡한데

읽어올 보드id 보내서 댓글 받아오면, 받아온 댓글 창을 생성까지 해줘야한다. 왜냐하면 없는 댓글의 창을 미리 만들어두는 것도 모양이 이상하게 몇개가 달릴지도 모르기 때문

댓글이 몇개일지 모르니 받아온 데이터 길이만큼 일단 for in문 돌려주고, 여기서 직접 선언한 변수들 안에 테이블 생성하고

작성자, 내용을 td에 넣어서 변수(tr,writer, content,date)에 넣어주고 이들을 다시 append()메소드로 tr에 추가하고 tr을 다시 tableBody에 넣어서 아래 달린 댓글창 전체를 만들어준다. 

 

	
	<script>
		// 댓글 등록 : jQuery ajax
		$('#rSubmit').click(function(){
			var rContent = $('#replyContent').val();
			var refBId = ${board.boardId};
			
			$.ajax({
				url:'addReply.bo',
				data:{replyContent:rContent, refBoardId:refId},
				success:function(data){
					if(data == 'success'){
						console.log(data);
						$('#replyContent').val(' ');
					}
				},
				error:function(data){
					console.log(data);
				}
				
			});
		});	
			
			
		// 등록한 댓글 읽어오기
		function getReplyList(){
			$.ajax({
				url:'rList.bo',
				data:{bId:${board.boardId}},
				success:function(data){
					console.log(data);
					
					// 계속 이어붙기 때문에 공백 넣어줘야함
					$tableBody = $('#rtb tbody');
					$tableBody.html('');
					
					// 변수선언
					var $tr;
					var $writer;
					var $content;
					var $date;
					$('#rCount').text('댓글('+data.length+')'); // 댓글(1) 알려주는 출력문구
					
					if(data.length > 0){
						for(var i in data){
							$tr = $('<tr>'); 	// 위에서 선언한 변수 var $tr;에서 다시 가져다 쓰므로 var 빠지고 $tr만
							$writer = $('<td>').css('width','100px').text(data[i].nickName);
							$content = $('<td>').text(data[i].replyContent);
							$date =  $('<td width="100px">').text(data[i].replyCreateDate);
							
							$tr.append($writer);
							$tr.append($content);
							$tr.append($date);
							$tableBody($tr);
						}
					}else{
						$tr = $('<tr>');
						$content = $('<td colspan="3">').text('등록된 댓글이 없습니다.');
						
						$tr.append($content);
						$tableBody.append($tr);
					}
				},
				error:function(data){
					console.log(data);
				}
			});
		}
		

		// 다른 사람이 쓴 댓글도 볼 수 있게 5초마다 읽어오도록
		$(function(){
			getReplyList();
			
			setInterval(function(){
				getReplyList();
			}, 5000);
		})
		
		
	</script>

 

728x90
반응형
728x90

 

 

오랫만에 다시 써보니 부분 부분 꽤 많이 잊어버렸다

역시 반복만이...

그래도 치다보니 드문 드문 생각이 나고 잠깐만 봐도 금방 기억이 났다

그동안 해온게 허사가 아님이 다행이다

일단 당분간은 sqld 올인이니 감안하고 조금 마음을 내려놓자

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
	#boardDetailTable{width: 800px; margin: auto; border-collapse: collapse; border-left: hidden; border-right: hidden;}
	#boardDetailTable tr td{padding: 5px;}
	.replyTable{margin: auto; width: 500px;} 
	
</style>
</head>
<body>

	<c:import url="../common/menubar.jsp"/>

	<h1 align="center">${ board.boardId }번 글 상세보기</h1>

	<h3 align="center">총 게시글 갯수 : ${pi.listCount }</h3>
	

	<form action="bupView.bo" method="post">
		<table border="1" id="boardDetailTable">
			<tr>
				<th>번호</th>
				<td>
					${board.boardId}
					<input type="hidden" name="boardId" value="${board.boardId }">
					<input type="hidden" name="page" value="${ page }">
				</td>
			</tr>
			
			<tr>
				<th>제목</th>
				<td>
					${board.boardTitle }
					<input type="hidden" name="boardTitle" value="${ board.boardTitle }">
				</td>
			</tr>
			
			<tr>
				<th>작성자</th>
				<td>
					${board.nickName }
					<input type="hidden" name="nickName" value="${board.nickName }">
				</td>
			</tr>
			
			<tr>
				<th>작성날짜</th>
				<td>
					${ board.boardCreateDate }
				</td>
			</tr>
			
			<tr>
				<th>작성날짜</th>
				<td>
					${ board.boardCreateDate }
				</td>
			</tr>
			
			
			<tr>
				<th>내용</th>
				<% pageContext.setAttribute("newLineChar", "\r\n"); %>
				<td>
					${fn:replace(board.boardContent,newLineChar,"<br>" }
					<input type="hidden" name="boardContent" value="${board.boardContent }">					
				</td>
			</tr>
			
			
			<c:if test="${ !empty board.originalFileName }">		
			<tr>
				<th>첨부파일</th>
				<td>
					<a href="${contextPath }/resources/buploadFiles/${board.renameFileName}" download="${board.originalFileName }">${board.originalFileName }</a>
					<input type="hidden" name="originalFileName" value="${board.originalFileName }">
					<input type="hidden" name="renameFileName" value="${board.renameFileName }">					
				</td>
			</tr>
			</c:if>
			
			<!-- url변수선언 -->
			<c:url var="bdelete" value="bdelete.bo">
				<c:param name="page" value="${page }"/>
				<c:param name="renameFileName" value="${board.renameFileName }"></c:param>			
			</c:url>
			<c:url var="blist" value="blist.bo">
				<c:param name="page" value="${page }"/>
			</c:url>	
			
			<!-- 로그인한 유저가 작성자라면, 수정삭제버튼 보이기 --> 
			<c:if test="${ loginUser.id eq board.nickName }">
				<tr>
					<td colspan="2" align="center">
						<button> 수정하기 </button>
						<button type="button" onclick="location.href='${bdelete}'">삭제하기</button>
					</td>
				</tr>
			
			</c:if>
		
		</table>
	</form>


	<!-- 시작페이지,목록보기 이동버튼 -->
	<p align="center">
		<button onclick="location.href='home.do'">홈으로</button>
		<button onclick="location.href='${blist }'">게시글 목록으로</button>
	</p>
	
	
		
	<!-- 댓글창 -->
	<table>
		<tr>
			<td><textarea cols="55" rows="3" id="replyContent"></textarea></td>
			<td><button id="rSubmit">댓글 등록</button></td>
		</tr>
	</table>
	<table class="replyTable" id="rtbs">
		<thead>
			<tr>
				<td colspan="2"><b id="rCount"></b></td>			
			</tr>
		</thead>
		<tbody>
			<tr>
				<!-- 댓글 보이는 부분 -->
			</tr>		
		</tbody>
	</table>

 

728x90
반응형
728x90

 

제네릭(Generic) 안에 String Class와 사용자정의 클래스의 차이에 대해 분명하게 인식하게 됨

String Class는 equals(), toString() 같은 것들이 내부적으로 포함이 되어있어 없어도 되지만 

일반 사용자정의 클래스의 경우 해주지 않으면 객체는 주소값으로 저장&연결 되기 때문에 값 비교가 안된다는 것

간단하게 쓰고 싶고 데이터타입이 str이라면 ArrayList에서 String을 제네릭으로 지정해서 사용하면 된다. 또는 곧 할 Map에서 키 밸류 받을 때 제네릭 매개변수에 2개가 들어가는데 그 중 하나로 써도 좋다

 

addAll에 들어가는 컬렉션 타입도 변수를 넣어서 더하고 더해서 많이 익숙해져서 컬렉션을 담은 변수랑 변수끼리 합치는 식으로 컬렉션끼리 안에 값을 합치는 것도 익숙해진 상태

 

	
/******************************** collection 6th practice ***************************************/	
	public void method06() {
		// 연습할 거 포인트 
		// 오버라이딩 해제하면서 toString(), equals()와 hashCode() 비교
		// 반환 타입(boolean,int등)에 따라 if,for,while문 조건식에 뭔가 응용해보기
		// 		반환 받은 객체로는 뭘 해볼 수 있을까? ==나 equals() 사용해서 해당 str 값이 있으면 if문 써봐도 될 듯
		
		// toString(), equals(), hashCode() 3개 코드 직접 써보기
		
		

		// vo클래스에 있는 오버라이딩된 toString(), equals(), hashCoding() 
		// 전부 주석처리
		
		ArrayList<Student> list1 = new ArrayList<>(2);
		ArrayList<Student> list2 = new ArrayList<Student>(2);
		ArrayList<Student> list3 = new ArrayList<>(1);
		
		// add(E e):boolean
		// add(int index, E element) 
		// Object의 toString()를 오버라이딩 때문에 주소값이 아닌 객체값이 바로나옴
		list1.add(new Student("zero",100));
		list1.add(0,new Student("0",0));
		
		list2.add(new Student("ㄱ",100));
		list2.add(1,new Student("ㄴ",100));
		
		System.out.println(list1); // [zero(0점), a(100점)]
		System.out.println(list2); // [ㄱ(100점), ㄴ(100점)]
		
		// addAll(Collection<? extends E> c) : boolean
//		list3.addAll(list1).addAll(list2); 메소드 체이닝 작동x
		list3.addAll(list1);
		list3.addAll(list2);
		System.out.println(list3); // [0(0점), zero(100점), ㄱ(100점), ㄴ(100점)]
		
		
		// addAll(int index, Collection c) : boolean
		list3.addAll(1,list1);
		System.out.println(list3); // [0(0점), 0(0점), zero(100점), zero(100점), ㄱ(100점), ㄴ(100점)]
		System.out.println(list3.addAll(4, list2)); // true
		System.out.println(list3); // [0(0점), 0(0점), zero(100점), zero(100점), ㄱ(100점), ㄴ(100점), ㄱ(100점), ㄴ(100점)]
		
		
		// 장점1. 크기 제약 x
		// 장점2. 추가/삭제/정렬 기능처리 간단
		
		// .size() : 인덱스 길이 반환
		System.out.println(list3.size()); // 8
		if(list3.size() >= 5) {
			System.out.println("아메리카노 1잔 주문"); // 아메리카노 1잔 주문
		}
		
		
		
		// 삭제
		// remove(int index):E
//		// remove()의 return은 삭제한 값을 돌려준다
//		list.remove(7);
		list3.remove(7);	// 끝에 ㄴ 지우기
		System.out.println(list3); // [0(0점), 0(0점), zero(100점), zero(100점), ㄱ(100점), ㄴ(100점), ㄱ(100점)]
		System.out.println(list3.remove(6)); // ㄱ(100점) <- 지운 값 반환
		
		
		// 삭제
		// remove(Object o):boolean
		// 같은 데이터라면 앞에 있는거부터 삭제
		// equals()가 오버라이딩이 안되어 있어서 값 비교가 아니라 주소값 비교라 삭제 못한 것.
		System.out.println(list3); // [0(0점), 0(0점), zero(100점), zero(100점), ㄱ(100점), ㄴ(100점)]
		System.out.println(list3.remove(new Student("ㄴ",100))); // false
		// VO class equals() 적용 후, true
		System.out.println(list3); // [0(0점), 0(0점), zero(100점), zero(100점), ㄱ(100점)]
		
		
		// 지네릭 추가 : <String> 
		// toString() 오버라이딩 삭제 -> 삭제해도 String Class자체에서 가능해서 값 출력이 됨
		// equals랑 hashCode가 잘 오버라이딩이 되어있기 때문에 삭제 가능
		ArrayList<String> sList = new ArrayList<>(1);
		
		sList.add(new String("a"));
		sList.add(new String("b"));
		sList.add(new String("c")); // 초기 지정길어 넘어서 길이 자동추가
		System.out.println(sList);  // [a, b, c]

		
		
		// set(int index, E e) : 바꾸기 전 값 반환
		// 해당 인덱스 번호에 값  교체
		// equals(),hashCode() 필요x
		sList.set(2, new String("cc"));
		System.out.println(sList);	// [a, b, cc]
		list2.set(1, new Student("ㄷ",100));
		System.out.println(list2);	// [ㄱ(100점), ㄷ(100점)]
		
		
		//get(int index):E
		// 인덱스번호의 엘리먼트 값을 가져온다
		System.out.println(list2.get(1)); // ㄷ(100점)
		System.out.println(sList.get(2)); // cc	
		
		
		// contains(Object) : boolean
		// indexObject : int 
		// equals() 삭제
		System.out.println(sList.contains("cc"));	// true
		System.out.println(list2.contains(new Student("ㄱ",100))); // false
		// String Class라서 cc는 true가 나왔고, list2는 값 비교가 안되고 객체참조의 디폴트인 주소값 비교라서 false가 나옴
		// equals()가 있고 다시 찍어보면 true
		
		
		// 지네릭<String>과 일반 참조객체<Student>의 오버라이딩 비교
		//  equals메소드와 해쉬코드가 오버라이딩 되지 않으면 주소값이 달라 없는걸로 나옴. 현재는 오버라이딩된 상태
		
		
		// clear():void
		list2.clear();
		System.out.println(list2); // []
		
		// isEmpty():boolean
		System.out.println(list2.isEmpty());	// true
		
		
	}
728x90
반응형
728x90

 

 

toString()은 한번에 썼고, 내용도 원하는데로 조절할 수 있을 정도의 느낌이 왔고

equals() 같은 경우 클래스 비교 쪽은 거의 감 잡았다. 다만, 내용비교 쪽에서 이중 if문 쪽이 조금 이해가 안되는 상태

hashCode() 쪽은 불모지...

 

간만에 setter, getter 썼는데 찬찬히 다시 쓰다보니 게터세터 반환타입이나 매개변수 여부 등이 해당 역할과 이어져 이해가 좀 깊어진 느낌이다. 세터는 값을 저장해주는 역할이니 값을 받을 매개변수가 필요하고 이를 VO class의 멤버변수(=필드,전역변수)에  전달해줘야하니 this키워드를 이용하여 전역변수에 전달해줘야하는 것이고,

게터는 해당 멤버변수 값을 읽어오게 하니, 리턴이 필요하고 값 을 넣거나 하는 것이 필요없으니 매개변수가 필요없는 것!

 

게터세터의 사용 목적

가장 큰 이점은 재사용을 위한 캡슐화가 가능해진다는 것

 

 

package chap12_Collection.B_Set.model.vo;

public class Dog2 {
	
	private String name;
	private double weight;
	
	
	// default constructor
	public void Dog2() {}
	
	// constructor with parameter
	public void Dog2(String name, double weight) {
		this.name = name;
		this.weight = weight;
	}
	
	// getter & setter
	public void setName(String name) {	// 값을 받아 저장하는게 setter니 리턴이 필요x -> void
		this.name = name;				// 값을 받아야하니 parameter 필요  
	}
	public String getName() {	// 해당 멤버변수의 값을 읽을 수 있게하는 역할의 getter이므로
		return name;			// return이 필요 & 데이터타입 필요
	}
	public void setWeight(double weight) {
		this.weight = weight;
	}
	public double getWeight() {
		return weight;
	}
	
	
	// toString()
	@Override
	public String toString() {
		return name + " "+weight+"kg";
	}
	
	
	
	// equals()
	public boolean equals(Object obj) {
		
		// 이퀄즈의 비교 내용 2가지
		// 1.클래스 비교
		// 2.내용 비교
		// 주소값 비교
		
		
		// 1.클래스비교
		if(this == obj) {
			return true;
		}	
		
		if(obj == null) {
			return false;
		}
//		if(obj == null) {
//			return false;
//		}else{				// if else문이 있으면 아래 if문에서 에러발생
//			return true;
//		}
		
		if(getClass() != obj.getClass()) {
			return false;
		}
		
		
		
		// 내용비교
		// 	1번 멤버변수 name 비교
		Dog2 other = (Dog2)obj;
		if(name == null) {
			if (other.name != null) {
				return false;
			}
		}else if(!name.equals(other.name)) {
			return false;
		}
		// 	2번 멤버변수 weight 비교
		if(weight != other.weight) {
			return false;
		}
		return true;
	}
	
	
	
	// hashCode()
	public int hashCode() {
		final int PRIME = 31;
		int result = 1;
		
		result = PRIME * result + (name == null ? 0 : name.hashCode());
		result = PRIME * result + (int)weight;
		
		return result;
		
	}
	
	
	
}
728x90
반응형
728x90


728x90
반응형

+ Recent posts