<1~4교시 자바>
메서드
package kr.or.ddit.study10;
/*
- 메서드 ==> 특정 기능을 수행하기 위한 명령어들(코드들)의 집합
- 특정 기능 수행 ==> 데이터를 입력받아 해당 데이터를 일련의 처리 과정으로
처리한 후 만들어진 결과값을 반환하는 것
- 메서드의 구조 또는 정의
접근제한자 정적(static) 여부 반환값의 자료형 메서드 이름( 매개변수들...){
처리할 내용들;
...
return 반환값;
}
- 접근제한자 ==> public, protected, private, 생략하면(default)
- 정적여부 ==> static 키워드가 있으면 '정적(static)메서드' 또는 '클래스메서드',
없으면 '인스턴스메서드'라고 한다.
- 반환값의 자료형과 return명령에 사용된 반환값은 자료형이 서로 맞아야 한다.
반환값이 없을 때는 '반환값의 자료형'에 void'라고 한다.
- 메서드이름 ==> 변수명 만드는 규칙과 같이 만든다. (보통 첫글자는 소문자로 한다.)
- 매개변수들 ==> '자료형이름 변수명'과 같이 작성하는데 0개 이상 사용할 수 있다.
- 메서드 사용 ==> 메서드를 호출하는 것을 말한다.
- 메서드를 호출하면 제어가 해당 메서드 영역으로 들어가서 차례로 실행을 하고
- 메서드의 처리가 모두 끝났거나 return 명령을 만나면 자기를 호출했던 곳으로
되돌아감
호출형식) 객체변수.메서드명(인수들...);
==> '인수들'은 메서드를 호출할 때 매개변수에 저장될 값들을 말한다.
- static 메서드에서 다른 static 메서드를 호출할 때는 '객체변수'를 생략할 수 있다.
- 인스턴스 메서드에서 다른 인스턴스 메서드를 호출할 때도 '객체변수'를 생략할 수 있다.
- 인스턴스 메서드에서 다은 static 메서드를 호출할 때는
'객체변수' 자리에 '객체변수' 또는 '클래스이름'을 사용해서 호출헤애 한다.
*/
public class MethodTest01 {
public static void main(String[] args) {
MethodTest01 test = new MethodTest01();
// ---------------------------------------------
// 정적 메서드에서 정적 메서드를 호출하는 방법
MethodTest01.hi(); // 클래스 이름을 사용해서 호출(정적 메서드일 경우에만 가능)
hi(); // 클래스 이름 또는 객체변수를 생략하여 호출
test.hi(); // 객체변수를 이용하여 호출
// ---------------------------------------------
// 정적 메서드에서 인스턴스 메서드를 호출하는 방법
String namee = "John von Neumann";
test.hi2(namee); // 반드시 객체변수를 이용해서 출력해야 한다.
test.hi2("하이");
// ---------------------------
test.methodCallTest();
}
// 메서드 호출 연습을 위한 메서드
public void methodCallTest() {
MethodTest01 ts = new MethodTest01();
//-------------------------------
//인스턴스 메서드에서 정적 메서드 호출하기
MethodTest01.add(10, 20); //클래스 이름을 사용해서 호출(정적 메서드일 경우에만 가능)
int k = 100, m = 200;
add(k,m); // 클래스 이름 또는 객체변수를 생략하여 호출
ts.add(1000,m); // 객체변수를 이용해서 호출
//-------------------------------
// 인스턴스 메서드에서 인스턴스 메서드 호출하기
// 반환값이 있을 경우에는 반환값을 받아서 변수에 저장할 수 있다
int r = sub(100, 30); // 객체변수를 생략하여 호출
System.out.println("100 - 30 = " + r);
int x = 200, y = 40;
// 출력문에서 반환값이 있는 메서드를 호출하면 반환값이 바로 출력된다.
System.out.println(x + " - " + y + " = " + sub(x,y));
}
// 정수형 데이터 2개를 받아서 뺄셈의 결과를 반환하는 인스턴스 메서드를 작성하시오.
public int sub(int a, int b) {
int result = a - b;
return result;
}
// 정수형 데이터 2개를 받아서 두 값의 덧셈 결과를 출력하는 정적 메서드를 작성하시오.
public static void add(int x, int y) {
int result = x + y;
System.out.println(x + " + " + y + " = " + result);
}
// 사람이름을 매개변수로 받아서 '~님 안녕하세요'를 출력하는 인스턴스 메서드를 호출하시오.
public void hi2(String name) {
System.out.println(name + "님 안녕하세요");
}
// '안녕하세요'라는 문자열을 출력하는 메서드를 작성하시오.
public static void hi() {
System.out.println("안녕하세요");
}
}
어려워요 메서드...
<5~8교시 DB>
CASE 문
CASE WHEN THEN 표현식)
-셀렉트 절에서만 사용
- CASE WHEN THEN, DECODE
- SELECT 절에서만 사용
1) CASE WHEN THEN
- 개발언어의 IF 또는 다중분기와 비슷한 기능을 제공(SWITCH와 유사)
(사용형식 1)
CASE expr WHEN 값1 THEN 명령1 --단일값
WHEN 값2 THEN 명령2
:
[ELSE 명령n] --(SWITCH의 default와 유사)
END
(사용형식 2)
CASE WHEN 조건식1 THEN 명령1 --범위, 조건
WHEN 조건식2 THEN 명령2
:
[ELSE 명령n]
END
사용예) 상품테이블에서 매입가가 30만원 이상인 상품 중
분류코드가 'P100'대는 '가전상품',
'P200'대는 '의류상품'
'P300'대는 '잡화상품'
그 외는 '분류코드 오류'를 상품구분란에 출력하시오
Alias는 상품명,분류코드,매입가격,상품구분
SELECT PROD_NAME AS 상품명,
LPROD_GU AS 분류코드,
PROD_COST AS 매입가격,
CASE SUBSTR(LPROD_GU,2,1) WHEN '1' THEN '가전상품'
WHEN '2' THEN '의류상품'
WHEN '3' THEN '잡화상품'
ELSE '분류코드 오류'
END AS 상품구분
FROM MJY.PROD
WHERE PROD_COST>=100000;
NULL처리 함수
2024-0913-01)NULL 처리함수
- NULL처리 연산자
. NULL값비교에 사용('='으로 NULL값을 비교할 수 없음)
. IS NULL, IS NOT NULL
사용예) 상품테이블에서 상품의 색상이 NULL인 상품의 상품코드, 상품명, 색상을 조회하시오.
SELECT PROD_ID AS 상품코드,
PROD_NAME AS 상품명,
PROD_COLOR AS 색상
FROM MJY.PROD
--WHERE PROD_COROR=NULL; -- '='부호를 가지고 NULL값 비교는 불가하다
WHERE PROD_COLOR IS NULL; -- 만약 IS NOT NULL 이라면 NULL이 아닌 나머지가 전부 표기됨
2. NVL(expr, value)
. expr의 값이 NULL이면 value를 반환하고 NULL이 아니면 expr 자신을 반환
. expr과 value는 같은 타입이거나 같은 타입으로 자동 형 변환 가능해야 함
사용예)사원테이블에서 COMMISSION_PCT 컬럼을 조회하여 그 값이 NULL이면
'영업실적없음'을 출력하시오.
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
COMMISSION_PCT AS 영업실적,
NVL(TO_CHAR(COMMISSION_PCT),'영업실적없음') AS 비고
--TO_CHAR으로 COMMISSION_PCT를 문자열로 타입 맞추기
FROM HR.EMPLOYEES;
사용예) 사원테이블에서 영업실적코드에 따른 보너스를 계산하고 지급액을 조회하시오
보너스 = 영업실적코드 * 급여 의 50%
지급액 = 급여 +보너스. 단, 영업실적코드가 null 이면 0으로 계산할 것
Alias는 사원번호,사원명,급여,영업실적코드,보너스,지급액
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
SALARY AS 급여,
NVL(TO_CHAR(COMMISSION_PCT,'0.99'),LPAD('없음',5)) AS 영업실적코드,
NVL(ROUND(COMMISSION_PCT*SALARY*0.5),0) AS 보너스,
SALARY+ NVL(ROUND(COMMISSION_PCT*SALARY*0.5),0) AS 지급액
FROM HR.EMPLOYEES;
사용예) 2020년 6월 모든 회원별 구매정보를 조회하시오 -- ~별:GROUP BY 모든:외부조인
Alias는 회원번호,회원명,구매금액합계이며 구매정보가 없는 회원은 “구매없음'을 출력하시오 --총회원은 24, 6명만 구매했다고 해도 조인을 사용 나머지 18명까지 포함
SELECT B.MEM_ID AS 회원번호,
B.MEM_NAME AS 회원명,
NVL(SUM(A.CART_QTY*C.PROD_PRICE),0) AS 구매금액합계 --구매금액합계(3개 테이블의 조합)
FROM MJY.CART A
RIGHT OUTER JOIN MJY.MEMBER B ON(A.MEM_ID=B.MEM_ID)
LEFT OUTER JOIN MJY.PROD C ON(A.PROD_ID=C.PROD_ID AND
A.CART_NO LIKE '202006%')
GROUP BY B.MEM_ID, B.MEM_NAME
ORDER BY 3 DESC;
사용예 전 선행사항)
** 상품테이블에서 분류코드 'P301'에 속한 상품의 판매가를 매입가로 변경하시오.
UPDATE MJY.PROD
SET PROD_PRICE=PROD_COST
WHERE UPPER (LPROD_GU)='P301';--대문자인지 소문자인지 헷갈린다면 'UPPER'사용하면 고민 끝!
COMMIT;
사용예) 상품테이블에서 매입가와 매출가가 동일한 제품을 찾아 조회하되 비고난에 '단종예정상품'을
동일하지 않으면 '정상판매상품'을 출력하시오.
Alias는 상품코드,상품명,매입가,매출가,비고
SELECT PROD_ID AS 상품코드,
PROD_NAME AS 상품명,
PROD_COST AS 매입가,
PROD_PRICE AS 매출가,
NVL2(NULLIF(PROD_COST,PROD_PRICE),'정상판매상품','단종예정상품')AS 비고
FROM MJY.PROD;
등위함수
2024-0913-02)등위함수
- RANK() OVER(ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
- DENSE_RANK() OVER(ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
- ROW_NUMBER() OVER(ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
- SELECT절에서만 사용 가능
- 그룹 내에서 등위 부여
RANK() OVER(PARTITION BY 컬럼명[,컬럼명,...]
ORDER BY 컬럼명[ASC|DESC] [,컬럼명[ASC|DESC],...])
사용예) 사원테이블에서 급여순으로 등위를 부여하시오(급여가 많은 사원 -> 적은사원순)
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
SALARY AS 급여,
RANK() OVER (ORDER BY SALARY DESC) AS "순위(RANK)",
DENSE_RANK() OVER (ORDER BY SALARY DESC) AS "순위(DENSE_RANK)",
ROW_NUMBER() OVER (ORDER BY SALARY DESC) AS "순위(ROW_NUMBER)"
FROM HR.EMPLOYEES;
사용예) 사원테이블의 부서로 그룹을 급여순으로 등위를 부여하시오
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
DEPARTMENT_ID AS 부서번호,
SALARY AS 급여,
RANK() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY DESC) AS "순위(RANK)"
FROM HR.EMPLOYEES;
사용예) 사원테이블에서 근속기간이 긴 순으로 등위를 부여하시오
SELECT EMPLOYEE_ID AS 사원번호,
EMP_NAME AS 사원명,
HIRE_DATE AS 입사일,
SALARY AS 급여,
RANK() OVER (ORDER BY HIRE_DATE) AS "순위(RANK)"
FROM HR.EMPLOYEES;
사용예) 회원테이블에서 마일리지 순으로 등위를 부여하시오
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 이름 ,
MEM_MILEAGE AS 마일리지,
RANK() OVER (ORDER BY MEM_MILEAGE DESC) AS "순위(RANK)"
FROM MJY.MEMBER;
사용예) 회원테이블에서 연령별 마일리지 순으로 등위를 부여하시오
SELECT MEM_ID AS 회원번호,
MEM_NAME AS 이름 ,
MEM_MILEAGE AS 마일리지,
TRUNC(EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM MEM_BIR), -1)||'대' AS 연령대,
RANK() OVER (PARTITION BY TRUNC (EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM MEM_BIR), -1) ORDER BY MEM_MILEAGE DESC) AS 순위
FROM MJY.MEMBER;
'개발 > 대덕인재개발원' 카테고리의 다른 글
대덕240920-자바:생성자/DB:외부조인 (5) | 2024.09.20 |
---|---|
대덕240919-자바:객체,클래스 개념/DB:형변환 함수,조인 (0) | 2024.09.19 |
대덕240912-자바:2차원배열,정렬/DB:날짜함수,집계함수 (1) | 2024.09.12 |
대덕240911-자바:/DB:문자열,숫자 함수 (1) | 2024.09.11 |
대덕240910 자바:참조 타입,변수/DB:기타 연산자 (0) | 2024.09.10 |