개인 공부/TIL

TIL #220517 #JSP #JAVA

kaleb 2022. 5. 17. 23:26
728x90

즐거운(?)화요일 오늘도 TIL가봅시다.

 

오늘은 어제에 이어서 오전 JSP수업 오후 JAVA수업이 진행되었습니다.

금요일부터 연이은 JSP의 일방적 폭행?으로 오늘은 나름 천천히 진행했던 것 같습니다.

 

오전 JS

 

시작은 바로 어제 있었던 JSP 수업의 복습을 먼저 진행!

 

JDBC를 이용해서 어제 마지막으로 했던 SELECT구문을 응용하였는데
간단한 회원가입 창에서 id를 하이퍼링크<a href>를 통하여 SELECT구문이 있는 페이지로 연결한 뒤

id를 기준으로 회원의 상세정보의 값들을 조회하는 문제에 대해 복습겸 연습을 진행하였습니다.

 

<a href = “”에서 파라미터 값을 넘겨주고 싶을 때는 ? 뒤에 그 값을 넣어줌

<a href = "select3.jsp?id=<%=rs.getString("id") %>"><%=rs.getString("id") %>
</a>

조회구문이나 인자를 받아오는데에서는 문제가 없었으나  페이지가 빈 화면으로 출력이 되어서

문제를 계속 찾다가 알게된 사실!!

?뒤의 id = 구문에서 id = 사이에 공백이 있을 경우 공백값이 들어가기 때문에 값이 다음페이지로 넘어가면오류가 발생합니다 조심조심!!

깔끔하게 하려고 공백을 포함했다 공백문자까지 포함되어서 문제를 찾지 못하였습니다 ㅜ

그래서 id=값으로 붙여서 사용해야함!

 

다른 페이지의 form action tag와 post방식으로 전달 받은 값을 받는 코드

request.setCharacterEncoding("UTF-8");
// post방식은 바로 request할 때 한글문자가 깨지기 때문에 
//setCharacterEncoding()로 UTF-8로 설정해준다.
int idx = Integer.parseInt(request.getParameter("idx"));
// request.getParameter()메서드는 리턴 값이 string타입인데 
// int타입으로 받아야 할때는 Integer.parseInt() 을 이용해서 int형으로 받는다

 

예제 연습 이후에는 다음시간에 대한 예고장 같은 수업을 진행하였는데 아직 배운 내용은 아니지만

문자열을 가지고 장난? 칠수 있는 메서드 Contain과 Split을 간단하게 활용하는 시간을 가졌습니다.

 

Contain :

String안의 값에 찾고자 하는 문자열이 포함되어 있는지를 알 수 있는 Class (Boolean type을 반환)

 

Split :

입력받은 값을 특정 문자(Delimeter)기준으로 문자열을 나누어 배열에 저장하여 리턴인자값을 기준(Delimeter)으로 문자열을 분리함!

배열의 형태로 나오기 때문에 구분자를 기준으로 첫번째가 jumins[0], 두번째가 jumins[1]!!

ex) jumins.split(”-”); 의 경우 주민이라는 문자열을 “-”을 기준으로 문자열을 분리함

//사용방법은 아주 간단한데 
// contains
public static void main(String[] args) {
	String name = "홍길동과 강감찬";
System.out.println(name.contains("홍길동")); //true
	
	String jumin = "960121-1212121";
	String[] jumins = str.split("-");
System.out.println(jumins[0]);

}

 

매개변수(Parameter)와 전달인자(Argument)가 계속 헷갈려서 한번 더 찾아보았습니다.

 

매개변수 :

함수의 정의에서 전달받은 인수를 함수 내부로 전달하기 위해 사용하는 변수를 의미

 

인수 :

함수가 호출될 때 함수로 값을 전달해주는 값

// 함수 정의에서 사용되는 값 = Parameter
// 함수를 호출할 때의 입력 값 = Argument

//함수 정의
def cancat(str1, str2):
	return a + " " + b 
// str1, str2 : parameter

cancat("para" , "more")
// "para", "more" : Argument

 

 

모듈화(Modulation)

 

어떤 기능을 담당하는 작은 단위를 모듈(Module)이라고 합니다.

하나의 작은 프로그램에서 특정 기능에 따라 작은 단위의 클래스 또는 메서드 형태로 작게 분리하는 것을 모듈화라고 한다.

  • Model 1 개발 방식 : 하나의 파일 내에서 디자인 관련 부분(프레젠테이션 로직)과 개발 관련 부분(비즈니스 로직)이 함께 존재하는 형태의 개발 방식
  • Model 2 개발 방식 : 디자인 관련 부분, 개발관련 부분을 분리하여 필요한 데이터만 서로 주고 받는 형태로 개발하는 형식

디자인 패턴 :

프로그램 개발 시 정형화 된 개발 코드 형태를 사용하여 특정 프로그램을 개발하는 코드의 형식

(오랜 시간 쌓여온 노하우, 내공같은 거라고 생각해봅시다.)

 

DAO & DTO 패턴

  • DAO (Data Access Object)
    클래스를 통해서 데이터베이스 처리 작업을 구현
    데이터베이스 처리 작업에 필요한 코드만 따로 모아 놓은 (모듈화) 한 클래스입니다.
    데이터 베이스 연결 및 해제, 각 SQL 구문을 실행하는 코드를 별도의 메서드를 통해서 기술해 놓고 외부에서 호출할때 사용할 수 있도록 제공합니다.

    ⇒ 외부에서 DAO 클래스의 인스턴스를 생성한 후 메서드를 호출하여 필요한 데이터베이스 작업을 수행하는 방식

    ex) XXXDAO 라는 이름의 클래스를 정의 (주로 XXX에는 해당 데이터베이스 작업을 수행하는 테이블명을 주로 사용함, 회원정보를 담는 member 테이블의 경우 DAO 클래스명 : MemberDAO
  • DTO (Data Transport Object)
    클래스를 통해서 데이터베이스 처리를 위해 사용되는 데이터를 저장하는 작업을 구현
    데이터베이스 작업에 필요한 데이터를 관리하는 클래스(객체)
    DAO 객체가 데이터베이스 작업을 수행하기 위해 사용할 데이터를 전달하거나 DAO 객체로 부터 조회된 데이터를 리턴 받을 때 변수를 사용하여 각 데이터를 관리해도 되지만 DTO 객체를 통해 여러 데이터를 하나의 묶음(= 객체)으로 관리하고, 전송할 수 있도록 합니다.
    데이터 베이스 테이블 내의 각 컬럼에 대응하는 인스턴스 멤버변수와 각 멤버변수에 대한 Getter/Setter 메서드로 구성됨(생성자도 필요에 따라 정의된다고합니다!

    ⇒ 멤버변수 접근제한자를 private으로 지정하고, 멤버변수는 접근한 getter/setter메서드의 접근 제한자의 경우 public 으로 지정한다!

    ex) XXXBean, XXXVo 등 다양한 이름을 사용하는데 DAO와 같은 방식으로 XXX가 정해진다.

Tip!

클래스 만들 때 잠시 설명해주셨던 내용입니다.
New class 시

프로젝트 폴더 내의 src/main/java → (default package) → 안에서 자바 클래스가 생성된다.

JSP에서는 jsp 페이지가 시작 점임 main() 메서드를 먼저 호출할 필요가 없기 때문에

클래스 생성시 public static void main 칸에서 체크할 필요가 없다

 

Getter/Setter의 생성의 단축키 Alt + Shitf + S → R

private 인경우 is not visible으로 표현된다. 따라서 자동완성할 때 가려져있음!

 


오후 JAVA

 

오늘도 지난시간 복습

클래스 :

설계도, 객체를 생성하기 위한 필드와 메서도가 정의되어 있습니다.

public class ClassName {
//필드 : 객체의 데이터가 저장되는 곳
int fieldname;

/*
*생성자 : 객체 생성 시 초기화 역할 담당, 클래스의 이름과 같은 이름이며 
* 메소드와 비슷한 형태
*/
ClassName() {}

//메소드 : 객체의 동작에 해당하는 실행 블록
void methodName() {}
}

 

인스턴스 :

클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고합니다.
설계도를 바탕으로 구현된 구체적인 실체, 객체를 소프트웨어에 실체화 하면 그것을 ‘인스턴스’ 라고 부릅니다.

 

객체를 생성하는 순서

개발자의 설계 → 클래스(설계도) → 인스턴스화 → 인스턴스(객체)

인스턴스, 생성자, 생성자 오버로딩, 메서드 오버로딩 및 문제점에 대한 간단한 정리 다시(기억이 나지않기때문)

 

생성자 오버로딩 :

매개변수(Parameter)를 달리하는 생성자를 여러 개 선언하는 것을 의미합니다.

자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공합니다.

 

메소드 오버로딩 :

클래스 내에 같은이름의 메소드를 여러 개 선언하는 것을 의미합니다.

하나의 메소드 이름이 여러 기능을 담는다라고 생각!

 

오버로딩만 간단하게 복습을 진행하였지만 다른 내용들도 살짝 헷갈려서 다시 적게 되었습니다. 모르면 반복 또 반복!!

 

가변형 인자(= 비정형 인자,  VARARGS; Variable Arguments) :

 

메서드 파라미터를 하나의 인자만 사용하여 다양하게 전달받는 기능인데 동일한 타입의 파라미터를 0개 ~ 무한개로 전달 받아 배열로 관리합니다.

전달 받는 인자의 갯수에 따라 자동으로 배열이 생성되며 메서드 파라미터 선언시 데이터타입 뒤에 기호로 표기합니다.

ex) public void add(int....nums){}

 

가변인자를 사용한 메서드의 대표적인 예 : prinft() 메서드

⇒ System.out.printf(String str, Object...objs) {}

 

다른 파라미터와 가변인자를 조합가능하지만 항상 다른 인자보다 뒤에 있어야 하고, 가변인자는 두개 이상 올 수 없으며 인자는 마지막 파라미터로 단 한번만 지정 가능하다고합니다...만능?

 

ex) int type 데이터 1개와 문자열 데이터 여러개 전달 가능

 

메서드 호출 시 값 전달 방식에 따른 차이

 

메서드 파라미터로 기본 데이터 타입과 참조 데이터 타입 전달 시 차이

메서드 호출시 값을 전달할 경우 값의 복사가 일어납니다.

  1. Pass by Value (값에 의한 전달) 메서드 호출 시 기본 데이터 타입 데이터를 전달하는 경우
    ⇒ 실제 값을 복사해서 전달 호출된 메서드 내에서 전달 받은 값을 변경해도 원본 데이터에서는 아무런 영향이 없다
  2. Pass by Reference (참조에 의한 전달) 메서드 호출 시 참조 데이터 타입 데이터를 전달하는 경우
    ⇒ 실제 값이 있는 공간의 주소 값(참조 값)을 복사해서 전달 호출된 메서드 내에서 전달 받은 값을 접근하여 해당 주소에는 데이터를 변경하는 경우, 원본데이터도 동일한 주소 값을 가지고 있기 때문에 변경된 결과에 영향을 받습니다.

this 키워드

자신의 인스턴스 주소 값을 저장하는 참조 변수

⇒ 개발자가 생성하는 것이 아니라 자바에 의해 자동적으로 생성됩니다.

모든 인스턴스 내에는 this가 존재하며, 자신의 인스턴스 주소가 저장합니다.

⇒ 즉, 인스턴스마다 this에 저장된 값이 서로 다름!

  • 레퍼런스 this
    자신의 인스턴스 내의 멤버에 접근(멤버변수 / 멤버메소드)
    주로, 로컬변수와 인스턴스 변수의 이름이 같을 때 인스턴스변수를 지정하는 용도로 사용합니다.

<레퍼런스 this 사용 기본 문법>
자신의 클래스 내의 생성자 또는 메서드 내에서 this. 인스턴스 변수 또는 this.메서드() 형태로 접근합니다.
로컬변수와 멤버변수를 구별하기 위해서는 멤버변수명 앞에 레퍼런스 this 를 사용하여 인스턴스에 접근하는 코드로 사용해야한다고 합니다.

 

외부에서 멤버변수 name에 접근 시 참조변수명.name 형태로 접근 하듯이
내부에서 멤버변수name에 접근 시 this.name의 형태로 접근합니다.
클래스 내의 메서드에서 멤버변수에 접근하기 위해서는 그냥 멤버변수이름을 지정하면됨

// main에서 
Person p = new Person(); 
//을 호출할 경우 
//class 안의
public person() {} // 이 호출 됨

 

파라미터가 있는 생성자의 경우에는

기본 생성자가 자동으로 생성되지 않는다!!

Person p = new Person("argument1" , "argument2");

Class Person {
String str1;
String str2;
public Person(String str1, String str2) {
	this.str1 = str1;
	this.str2 = str2;
	}
}

 

생성자 this()

자신의 생성자 내에서 자신의 또 다른 생성자를 호출

⇒ 생성자 오버로딩과 관련 레퍼런스 this 의 사용과 동일하게 자신의 인스턴스에 접근하여 다른 오버로딩 생성자를 호출하는 용도롤 사용합니다.

생성자 오버로딩 시 인스턴스 변수에 대한 초기화 코드가 중복되는데 초기화 코드 중복을 제거하는 용도로 사용합니다.
여러 생성자에서 각각 인스턴스 변수로 중복을 초기화하지 않고 하나의 생성자에서만 초기화 코드를 작성한 뒤 나머지 생성자에서는 해당 초기화 코드를 갖는 생성자를 호출하여 초기화 할 값만 전달 후 인스턴스 변수 초기화를 수행합니다.
메서드 오버로딩 시 코드 중복을 제거하기 위해서 하나의 메서드만 수행하고, 나머지 메서드는 해당 메서드를 호출하여 데이터를 전달하는 것과 동일함

단, 메서드는 이름()으로 호출, 생성자는 this()로 호출하는 차이

 

<생성자 this() 호출 기본 문법>

생성자 내의 첫번째 라인에서 (1번 째 줄의 의미가아니라 해당영역에서 가장 먼저 실행 되어야 함)

this(전달할 데이터...);

좀 내용이 긴데 코드로 간단하게 보면 이해하기 쉬운것 같습니다. (저도 글로는 이해가 잘안되더라구요)

public static void main(String[] args) {
		MyDate d1 = new MyDate();
		System.out.println(d1.year + "/" + d1.month + "/" +d1.day) ;
			// 1900/1/1
}
class MyDate {
	int year;
	int month;
	int day;
	
	// 기본 생성자 정의
	public MyDate() {
		
		this(1900, 1, 1); 
}

⇒ 코드 중복 제거 가능

Alt + Shitf + S → o : 파라미터 생성자 자동 생성

반응형

'개인 공부 > TIL' 카테고리의 다른 글

TIL #220519 #DB #WEB  (0) 2022.05.19
TIL #220518 #JAVA #NET  (0) 2022.05.18
TIL #220516 #JSP  (0) 2022.05.16
TIL #220513 #JSP  (0) 2022.05.13
TIL #220512 #DB #WEB  (0) 2022.05.12