20221206(화)
- 목차
- 코틀린 - 변수와 함수
- 코틀린 - 기초 데이타 타입
- 상품후기댓글 수정/삭제 버튼
< 코틀린 - 변수와 함수 >
- 변수선언
- 키워드 val ( = Java의 final과 동일, 값 변경 불가능), var (값 변경가능)
- 변수선언 기본 ➡ val(혹은 var) 변수명: 타입 = 값 - 타입유추 : 할당하고자 하는 값의 타입을 보고, 변수의 타입을 지정하는 기능.
변수선언시 초기값 할당해야 한다. - Test1-variable.kt
package com.example.androidlab.lab3.test2.sub1
val data1: Int = 10 // val data1 = 10 읽기만 가능. (값 변경불가능) 자바 final 동일
var data2 = 10 // 읽기, 쓰기가능 (값 변경가능)
fun myFun() {
// data1 = 20 // error
data2 = 20
}
- Test1-variable2.kt
✔ 초기화 미루기
변수 선언 시 초깃값을 할당할 수 없는 경우가 있음
➡ 값을 이후에 할당할 것이라고 컴파일러에게 알려주어야 함
(1) lateinit 사용
이후에 초기값 할당할 것임을 명시적으로 선언
var는 사용가능. val은 불가능
Int, Long, Short, Double, Float, Boolean, Byte 타입에는 사용 불가능.
(2) lazy 사용
코드에서 변수가 최초로 사용되는 순간에 lazy 블럭 값이 초기값으로 사용됨
- Test1-variable3.kt
✔ 코틀린에서 null 대입 가능여부
- 자바에서는 돌려봐야 알 수 있는데
- 코틀린에선 null에 대한 부분을 정확히 체크해 놓아서 컴파일 타임에서부터 오류가 발생된다.
✔ 데이타타입
- 코틀린의 모든변수는 객체이다. 즉, 자바의 기본 데이타타입에 해당하는 변수의 의미가 아니다.(중요)
✔ 변수선언
- var data1: Int = 10. 이때 Int 데이타타입은 클래스의 의미이다. 자바의 Integer의미로 봐야한다.
✔ 자바문법
- int a = null; 불가능
- Integer a = null; 가능
- Test2-type.kt
fun someFun() {
var data1: Int = 10 // null 대입 불가능
var data2: Int? = null // null 대입 가능
// data2 = 10
data1 = data1 + 10
data1 = data1.plus(10) // 객체에서 제공하는 메서드 사용
data2.plus(10) // 자바에서는 런타임시 예외발생. 코틀린에서 컴파일타임에서 오류발생
}
✔ fun someFun()에 오류가 날 경우 ➡ Test1-variable2.kt 패키지 명에 .sub1 추가되었는지 확인 필요
(같은 패키지 내 같은 클래스명 사용 불가!)
- 기초 데이타 타입
// 기초 데이타타입
val a1: Byte = 0b00001011 // 바이트
// 정수
val a2: Int = 123
val a3: Short = 123
val a4: Long = 10L
// 실수
val a5: Double = 10.0
val a6: Float = 10.0f
// 논리형
val a7: Boolean = true
// Char, String - 문자와 문자열
val a: Char = 'a' // 자바에서는 char타입은 정수데이타타입에 속한다. 코틀린은 다르다.
//a = 10 // 자바에서는 가능하지만, 코틀린에서는 불가능하다.
// 문자열 표현
fun main() {
val str1 = "Hello \n World"
// 삼중따옴표 표현시 줄바꿈이나 들여쓰기 등이 데이터에 그대로 반영된다.
val str2 = """
Hello
Hello
""".trimIndent()
println("str1 : $str1")
println("str2 : $str2")
}
- Test2-type2.kt
package com.example.androidlab.lab3.test2
/*
Any : 모든타입 가능
최상위 클래스. 자바의 Object 클래스와 같은 의미.
코틀린의 모든 클래스는 Any의 하위클래스이다.
Any클래스로 선언한 변수는 모든 데이터를 할당가능.
*/
val data1: Any = 10
val data2: Any = "Hello"
// 클래스 선언
class User
// User 클래스 객체생성해서 값 할당
val data3: Any = User()
/*
Unit : 반환문이 없는 함수. 자바의 void.
*/
val data4: Unit = Unit
fun some(): Unit {
println(10+20)
}
/*
Unit 생략 가능.
fun some() {
println(10+20)
}
*/
/*
Nothing - null이나 예외를 반환하는 함수
*/
val data5: Nothing? = null
// 반환은 하지만, 의미가 없는 표현.
fun some1() : Nothing? {
return null
}
// 예외를 던지는 경우
fun some2() : Nothing {
throw Exception()
}
// NPE : Null Pointer Exception. 실행시 변수가 null이어서 발생하는 예외.
// 널허용과 불허용
var data6: Int = 10
// data6 = null 에러발생
var data7: Int? = 10
data7 = null
- Test2-fun.kt
package com.example.androidlab.lab3.test2
// 함수 선언하기
// 함수 선언 키워드 : fun
/*
fun 함수명(매개변수명 : 타입) : 반환타입
*/
// 1. 반환타입이 있는 함수선언
// 매개변수에 var or val 키워드 사용불가능
// 자동으로 val 적용
fun some(data1: Int): Int {
return data1 * 10
}
fun some2(data1: Int) {
// data1 = 20 오류
}
// 매개변수 기본값 활용
fun main() {
fun some(data1: Int, data2: Int = 10): Int {
return data1 * data2
}
println(some(10))
println(some(10, 20))
println(some(data2=20, data1 = 10))
}
< 상품후기댓글 수정/삭제 버튼 >
✔ 댓글 작성자와 로그인한 자가 일치하면 수정/삭제 버튼 보여주고 아니면 안보여주는 작업
productDetail.jsp
<link rel="stylesheet" href="//code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/3.0.1/handlebars.js"></script>
<script id="reviewTemplate" type="text/x-handlebars-template">
{{#each .}}
<p>{{rv_content}}</p>
<div class="row">
<div class="col-md-3">{{idThreeDisplay mem_id}}</div>
<div class="col-md-9">{{prettifyDate rv_date_reg}}</div>
</div>
<div class="row">
<div class="col-md-3">{{displayStar rv_score}}</div>
<div class="col-md-9">{{authorityview mem_id rv_num}}</div>
</div>
<hr>
{{/each}}
</script>
아래 코드 추가
//댓글작성자와 로그인이 동일한 경우 수정,삭제버튼 표시
Handlebars.registerHelper("authorityview", function(mem_id, rv_num) {
let str = "";
let login_id = '${sessionScope.loginStatus.mem_id}';
if(mem_id == login_id) {
str += "<button type='button' class='btn btn-link' name='review_edit' data-rv_num='" + rv_num + "'>[edit]</button>";
str += "<button type='button' class='btn btn-link' name='review_delete' data-rv_num='" + rv_num + "'>[delete]</button>";
}
return new Handlebars.SafeString(str);
});
// 2)상품후기 페이징 출력하는 함수
let printreviewPaging = function(pageMaker, target) {
let pagingStr = "";
//이전표시. pageMaker.startPage - 1
if(pageMaker.prev) {
pagingStr += "<li class='page-item'><a class='page-link' href='" + (pageMaker.startPage - 1) + "' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>";
}
//페이지번호 표시
for(let i=pageMaker.startPage; i<=pageMaker.endPage; i++) {
let classStr = pageMaker.cri.pageNum == i ? "active" : "";
pagingStr += "<li class='page-item " + classStr + "'><a class='page-link' href='" + i + "'>" + i + "</a></li>";
}
//다음표시. pageMaker.endPage + 1
if(pageMaker.next) {
pagingStr += "<li class='page-item'><a class='page-link' href='" + (pageMaker.endPage + 1) + "' aria-label='Next'><span aria-hidden='true'>»</span></a></li>";
}
//console.log("페이지문자열: " + pagingStr);
target.children().remove();
target.append(pagingStr);
}
</script>
<script>
$(document).ready(function(){
// 이전, 페이지번호, 다음 클릭
$("nav ul.pagination").on("click", "li a.page-link", function(e){
e.preventDefault();
console.log("페이지번호");
reviewPage = $(this).attr("href"); // 현재 선택한 페이지번호
url = "/review/list/" + $("input[name='pdt_num']").val() + "/" + reviewPage;
getPage(url);
});
//상품후기 삭제
$("div#reviewList div#reviewItem").on("click", "button[name='review_delete']", function() {
let rv_num = $(this).data("rv_num");
if(!confirm("상품후기 " + rv_num + " 번을 삭제하시겠습까?")) return;
console.log("상품후기 번호: " + rv_num);
$.ajax({
url: '/review/delete/' + rv_num,
headers: {
"Content-Type" : "application/json", "X-HTTP-Method-Override" : "DELETE"
},
type: 'delete',
dataType: 'text',
success: function(result) {
if(result == "success") {
alert("상품후기가 삭제됨");
url = "/review/list/" + $("input[name='pdt_num']").val() + "/" + reviewPage;
getPage(url);
}
}
});
});
//상품후기 수정폼. review_edit
$("div#reviewList div#reviewItem").on("click", "button[name='review_edit']", function() {
$("#btn_review_write").hide();
$("#btn_review_edit").show();
let rv_score = $(this).parent().parent().find("input[name='rv_score']").val();
let rv_num = $(this).data("rv_num");
let rv_content = $(this).parent().parent().prev().prev().html();
console.log("별평점: " + rv_score);
console.log("상품후기 번호: " + rv_num);
console.log("후기내용: " + rv_content );
$("textarea#rv_content").val(rv_content);
$("textarea#rv_content").parent().find("input[name='rv_num']").remove();
$("textarea#rv_content").parent().append("<input type='text' name='rv_num' id='rv_num' readonly value='" + rv_num + "'>");
$("#star_rv_score a.rv_score").each(function(index, item) {
if(index < rv_score) {
$(item).addClass("on");
}else {
$(item).removeClass("on");
}
});
});
//상품후기 수정하기
$("#btn_review_edit").on("click", function() {
let rv_score = 0;
let rv_content = $("#rv_content").val();
$("p#star_rv_score a.rv_score").each(function(index, item) {
if($(this).attr("class") == "rv_score on") {
rv_score += 1;
}
});
if(rv_score == 0) {
alert("별 평점을 선택해주세요.");
return;
}
if(rv_content == "") {
alert("상품후기를 입력하세요");
return;
}
// JavaScript Object문법
let review_data = { rv_num : $("input[name='rv_num']").val() , rv_content : rv_content, rv_score: rv_score };
$.ajax({
url: '/review/modify',
headers: {
"Content-Type" : "application/json", "X-HTTP-Method-Override" : "PATCH"
},
type: 'patch',
dataType : 'text',
data: JSON.stringify(review_data), // JSON문자열
success : function(result) {
if(result == 'success') {
alert("상품후기가 수정됨");
url = "/review/list/" + $("input[name='pdt_num']").val() + "/" + reviewPage;
getPage(url);
// 초기화
$("p#star_rv_score a.rv_score").removeClass("on");
$("#rv_content").val("");
$("#btn_review_edit").parent().find("input[name='rv_num']").remove();
$("#btn_review_edit").hide();
$("#btn_review_write").show();
}
}
});
});
});
'🏫 Open API_JAVA' 카테고리의 다른 글
[96일차] 무통장 결제 (0) | 2022.12.11 |
---|---|
[95일차] 코틀린 배열 / 코틀린 컬렉션 / 후기 댓글 수정하기 (0) | 2022.12.11 |
[93일차] 안드로이드 코틀린 / 상품 후기 등록, 댓글 리스트 및 페이징 (0) | 2022.12.05 |
[92일차] 주문하기 코드모음 / 상품 상세페이지 / 상품 후기 작성 (0) | 2022.12.05 |
[91일차] 카카오페이 연결 / 상품 목록에서 바로구매 진행하기 (0) | 2022.12.01 |