본문 바로가기

web/JSP

jsp String에 대한 고찰..

색다른건 아니고.. 코딩을 하다가 잠시 착각을 했다.
JVM이 String 클래스를 생성할때 자동으로 "null"값으로 채워주는줄 알았다.
BUT 다 알다시피 String 의 null은 객체의 참조가 되지 않아 주소값이 null이란 소리다.(레퍼런스 null)
즉 String str = "" 과 String str1 = null 은 전혀 다른 소리란 이야기다.


1. if(stest==null) 일때

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<% 
String stest = request.getParameter("test");
%>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%=stest %>

<% if(stest==null){ out.print("yes");}else out.print("no"); %>
</body>
</html>

2. if(stest=="null") 일때

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<% 
String stest = request.getParameter("test");
%>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%=stest %>

<% if(stest=="null"){ out.print("yes");}else out.print("no"); %>
</body>
</html>

위의 코드의 결과 값은 과연 어떻게 나올까?! 
파라미터 없이 주소창은 http://localhost:9001/test/test.jsp 로 통해 들어간다.
알고리즘 문제도 아니고 단순한 JVM 장난하는거다.


그럼 만일 if 문에서 qeuals비교를 한다면?! (오늘 이것때문에 2시간을 허비했다.)
무슨 에러인지도 모를 말을 뿜어대며 실행조차 안된다.
error : The server encountered an internal error () that prevented it from fulfilling this request.

예전부터 느낀 거지만 예외처리의 중요성을 여기서 느낀다. 사소한 거라도 예외처리를 하지 않으면 피를 보게 된다는 말을 오늘 느낀다.(언제가 또 느끼게 되겠지.. 어이없는 사이드이펙트로..)


<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

<% 
String stest = request.getParameter("test");
%>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%=stest %>

<% if(stest.equals(null)){ out.print("yes");}else out.print("no"); %>
</body>
</html>

위와 같이 했을때 에러를 뿜어댄다.  if(stest.equals(null)) 을 "null"로 고쳐도 똑같다.  비교문이 잘못된게 아니다.

String stest = request.getParameter("test"); 부분에서 에러 처리를 하지 않았다. 만일 참조하는 레퍼런스가 없는 포인터를 if문했을때 결과는? 당연히 에러가 발생한다. 

예외처리는 삼항연산자로 간단하게 

String stest = request.getParameter("test")==null? "":request.getParameter("test");

 위와 같이 해주면 깔끔하게 된다. 왠만하면 거의 모든 파라미터 받는 부분에 사용하는게 정신 건강에 좋다.


-내가 헷갈렸던건 C++에선 당연히 공백으로 처리해준다. c++보다 성능이 좋다는 JVM은 당연히 되는줄알았다.
(가정이란게 이렇게 무서운거다.)
-어쩌면 사용자에게 에러 처리를 유도하기 위해서 일부러 않해준건 아닐까?