대덕240924-자바:private메소드,패키지,싱글톤 / DB:서브쿼리DML
<1~4교시 자바>
Getter,Setter
setter 메서드 ==> 멤버변수에 자료를 저장하는 역할을 한다.
형식) public void set변수명(자료형이름 변수명) {
this.멤버변수명 = 변수명;
}
getter 메서드 ==> 멤버변수의 값을 외부로 반환하는 메서드
형식) public 자료형이름 get멤버변수명(){
return 멤버변수명;
}
//프라이빗 선언
private String name;
//만들 때
public void setName(String name) {
this.name = name;
} // setter method
public String getName() {
return "[" +name+ "]";
} //getter method
//불러올 때
System.out.println(std); // std로 지정된 전체 불러오기
std.setName("홍길동"); //set으로 홍길동 정보 넣어놓고
System.out.println(std);
System.out.println();
System.out.println("name => " + std.getName()); //get으로 "홍길동" 출력
private을 외부에서 접근하기 위해서는 다음과 같은 메서드가 필요하다
setter: 자료를 넣을 때
getter:자료를 꺼낼 때
단축키(shift + Alt + S 로도 가능)
패키지,임포트
패키지를 왜 만드는 걸까?
예를 들어 나에게 판매클래스의 '멤버'가 있다고 하자,
잘 짜여진 성적클래스를 외부에서 불러오고 싶은데 그 성적클래스에 이미 '멤버'라는 이름이 있다면
중복이 발생하므로 로 사용하기 어렵게 된다.
이와 같이 여러 클래스 파일을 불러오거나 할떄 클래스 이름이 중복되면 사용이 어렵기 때문에
폴더라는 형태로 분리해준 것이 패키지이다
/*
패키지(package) ==> 물리적 형태는 파일 시스템의 폴더이다.
==> 역할 : 클래스를 유일하게 만들어주는 식별자 역할을 한다.
(클래스이름이 같아도 패키지가 다르면 다른 클래스로 인식한다.)
클래스의 전체이름 : '상위패키지.하위패키지.클래스명'
예) 현재 클래스의 전체 이름 : kr.or.ddit.study14.PackageTest
패키지명 : '상위패키지.하위패키지.패키지'
패키지 선언) java source 파일의 첫번째 줄에 package 명령어로 선언한다.
형식) package 상위패키지.하위패키지.패키지;
패키지를 만들 떄 이름 작성 규칙
- 숫자로 시작 안됨,'_','$'외의 특수문자 사용 불가
- 자바에서 이미 사용되고 있기에 java. 으로 시작하는 패키지는 사용되지 않는다.
- 보통은 모두 소문자로 작성한다.
- 패키지명이 중복되는 것을 방지하기 위해서 해당 소속 기관의 도메인명을
역순으로 많이 사용한다.
(예: 대덕인재개발원 도메인 ==> ddit.or.kr
패키지명 ==> kr.or.ddit)
*/
/*
import문 ==> 클래스는 기본적으로 패키지명을 포함한 전체 이름을 사용해야 한다.
그렇지만 import문을 이용하여 클래스가 소속된 패키지명을 알려주면
클래스만 사용할 수 있다(편리하다).
형식) import 상위패키지.하위패키지.클래스명; ==> 해당 클래스 1개만 적용
import 상위패키지.하위패키지.* ==> 하위패키지에 소속된 모든 클래스가 적용
*/
import kr.or.ddit.study13.sec02.*;
//import kr.or.ddit.study12.sec02.*;
public class PakageTest {
public static void main(String[] args) {
kr.or.ddit.study13.sec02.Student std
= new kr.or.ddit.study13.sec02.Student();
//이건 너무 길죠? import문을 이용하여 간단히 줄여봅시다
Student std2 = new Student();
//이와 같이 import문으로 미리 경로를 지정하면 간략하게 사용 가능해요
//중복될 경우 어느 패키지에 속한 지 알 수 없으므로 import문의 중복은 지양
kr.or.ddit.study12.sec02.Student std3
= new kr.or.ddit.study12.sec02.Student(null, 0, 0, 0);
}
}
싱글톤
/*
singleton 패턴 ==> 객체가 1개만 만들어지게 하는 방법
(외부에서 new 명령을 사용하지 못하게 하는 방법)
사용이유 : 1. 메모리 낭비 방지
2. 데이터의 공유가 쉽다(중개자 역할을 하는 객체를 하나만 설정한다면
저장되고 불러오는 객체를 동일하게 할 수 있다).
- singleton패턴의 클래스를 만드는 방법(필수 구성 요소)
1. 자신 class의 참조값이 저장될 변수를 private static으로 선언한다.
2. 모든 생성자의 접근 제한자를 private으로 한다.
3. 자신 class의 인스턴스를 생성하고 반환하는 메서드를
public static으로 작성한다
(이 메서드의 이름은 보통 'getInstance'로 한다.)
*/
public class MySingleton {
// 1번
private static MySingleton single;
// 2번
private MySingleton() {
System.out.println("생성자 입니다...");
}
// 3번
public static MySingleton getInstance() {
// 1번의 변수가 null이면 객체를 생성해서 1번 변수에 저장한다.
// 그리고 1번의 변수값을 반환한다.
if(single==null) single = new MySingleton();
return single;
}
// 기타 이 클래스가 처리할 내용들을 작성한다.
public void displayTest() {
System.out.println("싱글톤 클래스에서 처리한 내용입니다.");
}
}
<DB>
서브쿼리
1. INSERT문과 서브쿼리
- 서브쿼리가 사용되는 INSERT문에서는 VALUES절이 생략됨
- 서브쿼리를 기술할 때 '( )' 사용하지 않음
(사용형식)
INSERT INTO 테이블명[(컬럼명,컬럼명,...)]
SELECT 문;
- 테이블의 컬럼명의 갯수,순서,타입과 서브쿼리 SELECT절의 갯수,순서,타입은 일치해야 함
DB테이블 추가 ==> RETIRE 테이블 추가
사용예)오늘 날짜로 사원번호 107, 121, 144번 사원을 퇴직처리함
퇴직자의 정보는 RETIRE테이블에 저장
INSERT INTO HR.RETIRE(EMPLOYEE_ID,DEPARTMENT_ID,JOB_ID,RETIRE_DATE)
SELECT EMPLOYEE_ID,DEPARTMENT_ID,JOB_ID, SYSDATE
FROM HR.EMPLOYEES
WHERE EMPLOYEE_ID IN(107, 121, 144);
COMMIT;
2. UPDATE 문과 서브쿼리
(사용형식)
UPDATE 테이블명 [별칭]
SET 컬럼명=(서브쿼리),
컬럼명=(서브쿼리),
:
UPDATE 테이블명 [별칭]
SET (컬럼명,컬럼명,...)=(서브쿼리) --컬럼의 순서,타입이 일치해야 함
사용예)오늘날짜'f001'회원이 상품'p202000008'을 3개 구입했다
이 정보를처리하시오.
1) 장바구니번호생성
SELECT NVL(MAX(CART_NO)+1,TO_CHAR(SYSDATE,'YYYYMMDD')||TRIM('00001'))
FROM PYK99.CART
WHERE TO_DATE(SUBSTR(CART_NO,1,8))=TO_CHAR(SYSDATE,'YYYYMMDD');
2)CART에 자료삽입
INSERT INTO PYK99.CART VALUES('f001',(SELECT NVL(MAX(CART_NO)+1,TO_CHAR(SYSDATE,'YYYYMMDD')||TRIM('00001'))
FROM PYK99.CART
WHERE TO_DATE(SUBSTR(CART_NO,1,8))=TO_CHAR(SYSDATE,'YYYYMMDD')),
'P202000008',3);
**상품테이블의 판매단가(PROD_PRICE)의 0.7%의 정수 값을 마일리지로 설정
UPDATE PYK99.PROD
SET PROD_MILEAGE=ROUND(PROD_PRICE*0.007);
COMMIT;
UPDATE PYK99.REMAIN A
SET(A.REMAIN_O,A.REMAIN_J_99,REMAIN_DATE)=(SELECT A.REMAIN_O+3,
A.REMAIN_J_99-3,
SYSDATE
FROM DUAL)
WHERE A.PROD_ID='P202000008';
4) MILEAGE UPDATE
SELECT PROD_MILEAGE*3
FROM PYK99.PROD
WHERE PROD_ID='P202000008';
UPDATE PYK99.MEMBER
SET MEM_MILEAGE=MEM_MILEAGE+( SELECT PROD_MILEAGE*3
FROM PYK99.PROD
WHERE PROD_ID='P202000008')
WHERE MEM_ID='f001';
COMMIT;
(INSERT)인서트:해당 자료가 하나도 없을 때
(UPDATE)업데이트: 이미 있는 자료의 값을 변경할 때