반응형
    // String : 문자열 자료형
    // 0 ~ 다수의 문자들로 구성됨
    // ""로 둘러쌈
    // String은 참조 자료형임

    // 리터럴 방식
    String str1 = "Hello Java!";
    String str2 = "반갑습니다. 주녘의 블로그입니다.";

    // 빈 문자열도 가능
    String str3 = "";

    // 인스턴스 생성 방식
    String str4 = new String("안녕, 나는 주녘이야");

    String hi1 = "Hi";
    String hi2 = "Hi";
    String jv = "Java";

    // 리터럴끼리는 == 사용하여 비교가 가능함
    boolean bool1 = hi1 == hi2;  	// true
    boolean bool2 = hi1 == jv;		// false

    String hi3 = new String("Hi");
    String hi4 = new String("Hi");
    String hi5 = hi4;

    // 인스턴스와 비교하려면 == 이 아닌 .equals 메소드를 사용

    boolean bool3 = hi3 == hi4;		// false
    // 같은 Hi 인데 왜 false로 나올까?
    // hi3와 hi4 메모리의 다른 주소값으로 인스턴스가 생성되었기 때문!
    int result = System.identityHashCode(hi3);		// 2074407503
    int result2 = System.identityHashCode(hi4);		// 999966131

    boolean bool4 = hi1.equals(hi2);		// true
    boolean bool5 = hi1.equals(hi3);		// true
    boolean bool6 = hi1.equals(hi4);		// true
    boolean bool7 = hi1.equals(hi2);		// true
    boolean bool8 = hi4 == hi5;			// true
}

 

반응형

'Java > Java 이론' 카테고리의 다른 글

클래스  (0) 2023.09.20
[JAVA 다시보기] 자바기초  (1) 2023.09.19
[JAVA] 참조변수의 형변환  (0) 2023.08.11
[JAVA] 인터페이스(interface)  (0) 2023.08.11
[JAVA] String 클래스  (0) 2023.08.10
반응형

📌 문자함수 - 대/소문자 변환

 
-- 1) 문자 함수
-- 사용법) 대문자변환 : UPPER('문자열') -- 문자열 대신 컬럼명도 올 수 있음
--        소문자변환 : LOWER('문자열')
--        첫글자만대문자 : INITCAP('문자열')
-- 원본을 조작하지 않음(화면에만 임시로 바뀜)
SELECT 'Oracle mania'
       ,UPPER('Oracle mania') AS "대문자"
       ,LOWER('Oracle mania') AS "소문자"
       ,INITCAP('Oracle mania') AS "첫 글자만 대문자"
FROM DUAL;

-- 연습 1) 사원테이블에서 사원명(ENAME)을 소문자로 출력하고,
--        직위(JOB)은 첫글자만 대문자로 출력하세요
SELECT LOWER(ENAME),
       INITCAP(JOB)
FROM   EMPLOYEE;

-- 연습 2) SCOTT 사원을 조회해서 사원번호(ENO), 사원명(ENAME), 부서번호(DNO) 출력하기
-- 단, SCOTT 이 대소문자 구분없이 비교된다고 가정하고 작성하세요
SELECT ENO, ENAME, DNO FROM EMPLOYEE
WHERE  ENAME = UPPER('scott');

📌 문자함수 - 문자열 길이 리턴 함수


-- 1-2) 문자 길이를 RETURN 하는 함수
-- LENGTH(문자열) : 한글/영어 상관없이 문자개수를 세어서 RETRUN 하는 함수
-- 코딩 언어셋 : 영어 표현(1BYTE), 한글표현(3BYTE) [UTF-8 표현식(국제표준)]
SELECT LENGTH('Oracle mania')
      ,LENGTH('오라클매니아')
FROM DUAL;

-- 1-3) 문자 조작함수 : 문자열 붙이기
-- 함수 :  CONCAT('문자열 1','문자열 2')
-- 기호 : '문자열1'||'문자열2'
SELECT 'Oracle'
       ,'mania'
       ,CONCAT('Oracle','mania')
       ,'Oracle'||'mania'
FROM DUAL;

📌 문자함수 - 문자열 자르기, 붙이기, 공백제거


-- 1-4) 문자 조작함수 : 문자열 자르기
-- SQL : 인덱스번호 1부터 시작
-- 사용법) SUBSTR('대상컬럼',시작위치,자를개수)
-- 단, 시작위치가 음수이면 뒤에서 셈
SELECT SUBSTR('Oracle mania',4,3)
      ,SUBSTR('Oracle mania',-1,1)
FROM DUAL;

-- 예제 3) 이름이 N으로 끝나는 사원 화면에 출력하기
-- SUBSTR 함수 사용
-- SQL 성능이 좋게 작성하는 것이 어려움
-- WHERE 왼편(함수 사용) = 오른쪽값 ==> 성능이 대폭 저하
-- WHERE 절 오른쪽값에 함수를 쓰는 것이 성능에 좋음
SELECT * FROM EMPLOYEE
WHERE SUBSTR(ENAME, -1, 1) = 'N';

-- 1-5) 문자열에서 대상 문자를 찾아서 인덱스번호를 RETURN 함수
-- SQL의 인덱스번호는 1부터 시작함
-- 사용법)
SELECT  INSTR('Oracle maina','a')
       ,INSTR('오라클매니아','라')
FROM DUAL;

-- 1-6) 컬럼에 어떤 문자를 붙이기 함수 : LPAD, RPAD
-- LPAD 함수 : 어떤 문자를 왼쪽에 채우기 함수
-- 사용법 : LPAD(대상컬럼, 자리수, 채울문자)
-- 자리수에서 빈칸은 채울문자로 채워짐(왼쪽)
SELECT LPAD(SALARY, 10, '*')
FROM EMPLOYEE;

-- RPAD 함수
SELECT RPAD(SALARY, 10, '*')
FROM EMPLOYEE;

-- 1-7) 문자열에서 공백제거 함수 LTRIM, RTRIM, TRIM(*)
-- 사용법) LTRIM(컬럼명) : 왼쪽 공백제거
--        RTRIM(컬럼명) : 오른쪽 공백제거
--         TRIM(컬럼명) : 양쪽 공백제거
SELECT 'Oracle mania'
      ,LTRIM('          Oracle mania            ')
      ,RTRIM('          Oracle mania            ')
      ,TRIM('          Oracle mania            ')
FROM DUAL;


 

📌 숫자함수 - 반올림, 버림, 나머지 연산

-- 1) 반올림 : ROUND()
-- 사용법) ROUND(대상컬럼, 자리수)
-- 참고) 자리수가 음수일 경우 일의 자리부터 반올림이 됨
SELECT 98.7654
       ,ROUND(98.7654)          -- 0 자리에서 반올림
       ,ROUND(98.7654, 2)       -- 2nd 자리에서 반올림
       ,ROUND(98.7654, 1)       -- 1st 자리에서 반올림
       ,ROUND(98.7654, -1)      -- 1의 자리에서 반올림
FROM DUAL;

-- 2) 버림, 내림 : TRUNC(), 특정자리수에 버림
SELECT 98.7654
       ,TRUNC(98.7654)          -- 소수점 첫번째 자리에서 버림
       ,TRUNC(98.7654, 2)       -- 소수점 두번째 이하 버림
       ,TRUNC(98.7654, -1)      -- 1의 자리에서 버림
FROM DUAL;

-- 3) MOD : 나머지 연산 함수 ( == % : 나머지 연산자(JS))
-- 사용법) MOD(대상컬럼, 나눌숫자) : 결과 나머지가 RETURN 됨
SELECT MOD(31, 2)
      ,MOD(31, 5)
      ,MOD(31, 8)
FROM DUAL;

-- 연습 1) 모든 사원의 급여를 각각 500으로 나눈 나머지를 계산해서 출력하세요
SELECT MOD(SALARY, 500)
FROM   EMPLOYEE;

📌 날짜함수

-- 날짜 함수
-- 1) SYSDATE : 시스템에 저장된 현재 날짜를 RETURN 하는 함수(*****)
-- DB의 자료형 : 문자열(VARCHAR2 형, CHAR 형), 숫자(NUMBER 형), 날짜(DATE 형)
-- 단, 오라클 기준
SELECT SYSDATE FROM DUAL;

-- 예제 1) 오늘, 어제 내일 날짜를 출력해보세요
SELECT  SYSDATE - 1 AS 어제
       ,SYSDATE     AS 오늘
       ,SYSDATE + 1 AS 내일
FROM DUAL;

-- 예제 2) 근무일수 계산하기
-- 공식 : 현재시간 - 입사일 : 근무일수
SELECT ROUND(SYSDATE - HIREDATE) AS 근무일수
FROM EMPLOYEE;

-- 2) MONTHS_BETWEEN(현재날짜, 과거날짜) : 두 날짜 사이의 개월수 리턴
-- 각 사원들이 근무한 개월 수 구하기
SELECT ENAME, SYSDATE, HIREDATE
    ,TRUNC(MONTHS_BETWEEN(SYSDATE, HIREDATE)) AS 개월수
FROM EMPLOYEE;

-- 3) ADD_MONTHS(날짜컬럼, 숫자)
-- 예제 4) 입사일에서 6개월이 지난 날짜 구하기
SELECT ENAME, HIREDATE,
       ADD_MONTHS(HIREDATE, 6) AS 개월수더하기
FROM   EMPLOYEE;

-- 4) NEXT_DAY(날짜컬럼, '요일')
-- 날짜컬럼에서 최초로 도래하는 요일의 날짜를 RETURN 함수
-- 예제 5) 오늘을 기준으로 최초로 도래하는 토요일의 날짜 구하기
SELECT SYSDATE
      ,NEXT_DAY(SYSDATE, '토요일')
FROM DUAL;

-- 5) LAST_DAY(날짜 컬럼)
-- 날짜컬럼의 그 달(월)의 마지막 날의 날짜를 구해주는 함수
-- 예제 6) 입사한 날의 그 달의 마지막 날 구하기
SELECT ENAME, HIREDATE,
       LAST_DAY(HIREDATE)
FROM EMPLOYEE;

 

📌 자료형 변환함수

-- DB 자료형 : 문자열(VARCHAR2(가변문자열), CHAR(고정문자열))
--            숫자(NUMBER, 실수, 정수)
--            날짜형(DATE)
-- 1) TO_CHAR : 날짜 -> 문자열로 바꾸는 함수
-- 사원 : EMPLOYEE
-- 날짜컬럼 : HIREDATE(입사일)
-- 사용법 ) TO_CHAR(컬럼명, '날짜포멧')
-- 날짜포멧 :
-- YYYY(년도(4자리)), YY(2자리) [YEAR]
-- MM(월(2자리))               [MONTH]
-- DD(일(2자리))               [DAY]
-- DAY(요일)                   [요일]
-- HH(1~12까지의 시간)          [HOUR]
-- HH24(1~24까지의 시간)
-- MI(분(2자리))               [MINUTES]
-- SS(초(2자리))               [SECOND]

SELECT ENAME, HIREDATE,
       TO_CHAR(HIREDATE, 'YY-MM') AS 단축날짜,
       TO_CHAR(HIREDATE, 'YYYY-MM-DD HH24:MI:SS') AS 날짜
FROM EMPLOYEE;

-- 연습 1) 현재 날짜와 시간을 표현하세요
SELECT SYSDATE,
      TO_CHAR(SYSDATE, 'YYYY/MM/DD, HH24:MI:SS') AS 현재날짜
      FROM DUAL;
     
-- 2) TO_CHAR : 숫자 -> 문자로 변환
-- 사용법) TO_CHAR(숫자컬럼, '숫자포맷')
-- 예제 2) 급여를 출력하면서 통화기호를 (W, $ 등) 포함해서 출력하세요
-- 숫자포맷 : L - 각 나라별 통화 기호를 자동으로 붙여줌(W, $ 등)
--          9 - 3자리를 잡고 자리수가 모자라도 따로 0을 채워주지 않음
--          0 - 3자리를 잡고 자리수가 모자라면 0을 채워줌
--          , - 각 통화의 중간에 쉼표(,)를 자동으로 추가해줌
SELECT ENAME, SALARY,
TO_CHAR(SALARY, 'L999,999'),
TO_CHAR(SALARY, 'L000,000')
FROM EMPLOYEE;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
SQL 기본(2)  (0) 2023.09.08
SQL 기본  (0) 2023.09.08
반응형

📌 데이터에 조건을 붙여 조회하기(WHERE)

-- 파일명 : 02_Select_Where.sql
-- 데이터에 조건을 붙여 조회하기
-- 1) 비교연산자로 조건절 사용하기
-- 예제 1) 월급(SALARY)이 1500 이상인 사원 조회하기
-- 사용법) SELECT 컬럼명, 컬럼명2... FROM 테이블명
--        WHERE 조건절(컬럼명 (부등호 >, >=, <, <=, =(같다), <>(같지않다)) 값);
SELECT ENAME, SALARY FROM EMPLOYEE
WHERE SALARY > 1500;
 

-- 예제 2) 10번 부서의 소속 사원을 출력하세요
SELECT * FROM EMPLOYEE
WHERE DNO = 10;

-- 예제 3) 사원명(ENAME)이 SCOTT인 사원을 출력하세요
SELECT * FROM EMPLOYEE
WHERE ENAME='SCOTT';

-- 예제 4) 입사일이(HIREDATE) 이 '1981/01/01' 이전인 사원만 출력
SELECT * FROM EMPLOYEE
WHERE HIREDATE <= '1981/01/01';

📌 논리연산자와 함께 조건절 사용하기


-- 2) 논리 연산자와 함께 조건절 사용하기
-- 논리 연산자 : AND, OR, NOT
-- 성능 : AND > OR(NOT)
-- 예제 5) 부서번호(DNO) 가 10이고, 직급(JOB)이 'MANAGER'인 사원을 출력하세요
SELECT * FROM EMPLOYEE
WHERE DNO = 10
AND   JOB = 'MANAGER';

-- 연습 1) 급여가 1000과 1500 사이의 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE SALARY >= 1000
AND SALARY <= 1500;

-- 예제 6) 부서번호가 10이거나 직급이 'MANAGER' 인 사원만 출력하기
SELECT * FROM EMPLOYEE
WHERE DNO = 10
OR    JOB = 'MANAGER';

-- 예제 7) 10번 부서에 소속된 사원을 제외하고 나머지 사원 출력하기
-- 사용법) SELECT 컬럼명 FROM 테이블명
--        WHERE NOT 컬럼명; (그 값에 반대되는 데이터가 출력됨)
SELECT * FROM EMPLOYEE
WHERE NOT DNO = 10;

-- 다른 방법 : 비교연산자 <> 사용
SELECT * FROM EMPLOYEE
WHERE DNO <> 10;

-- 연습 2) 급여가 1000 미만이거나 1500 초과인 사원 출력
SELECT * FROM EMPLOYEE
WHERE SALARY < 1000
OR SALARY > 1500;

-- 연습 3) 커미션이 300 이거나 500이거나 1400 인 사원 출력
SELECT * FROM EMPLOYEE
WHERE COMMISSION = 300
OR    COMMISSION = 500
OR    COMMISSION = 1400;

📌 BETWEEN 예약어


-- 3) BETWEEN 예약어
-- 예제 8) 급여가 1000과 1500 사이의 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE SALARY >= 1000
AND SALARY <= 1500;

-- BETWEEN 사용
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         WHERE 컬럼명 BETWEEN 작은값 AND 큰 값;  
-- 사용처 : 작은값 ~ 큰 값 사이의 결과 조회하기 할 때 사용
SELECT * FROM EMPLOYEE
WHERE SALARY BETWEEN 1000 AND 1500;

-- NOT BETWEEN
-- 예제 9) 급여가 1000 미만 이거나 1500 초과인 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE SALARY < 1000
OR SALARY > 1500;

-- NOT BETWEEN 사용
SELECT * FROM EMPLOYEE
WHERE SALARY NOT BETWEEN 1000 AND 1500;

-- 연습 3) 1982년에 입사한 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE HIREDATE BETWEEN '1982/01/01' AND '1982/12/31';

📌 IN 예약어


-- 4) IN 예약어
-- 예제 10) 상여금(COMMISSION)이 300이거나 500이거나 1400인 사원 조회
SELECT * FROM EMPLOYEE
WHERE COMMISSION = 300
OR    COMMISSION = 500
OR    COMMISSION = 1400;

-- IN 사용
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         WHERE 컬럼명 IN (값, 값2, 값3....);
-- 사용처 : OR로 연결된 데이터를 간단하게 사용가능
SELECT * FROM EMPLOYEE
WHERE COMMISSION IN (300, 500, 1400);

-- NOT IN 사용
-- 예제 11) 상여금(COMMISSION)이 300이 아니고, 500이 아니고, 1400이 아닌 사원 조회
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         WHERE 컬럼명 NOT IN (값, 값2, 값3....);
SELECT * FROM EMPLOYEE
WHERE COMMISSION NOT IN (300, 500, 1400);

📌 LIKE 검색


-- 5) LIKE 검색(*****)
-- 정의 : 일부 키워드(영문자, 한글)만 사용해서 비슷한 것들만 추려서 조회하기
-- 예제 12) 이름이 'F'로 시작하는 사원 조회하기
-- 사용법) SELECT 컬럼명 FROM 테이블명
--        WHERE 컬럼명 LIKE '%키워드%';
-- % : 키워드를 제외한 문자들
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE 'F%';

-- 연습 4) 이름에 'M'이 포함되어 있는 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '%M%';

-- 연습 5) 이름이 'N'으로 끝나는 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '%N';

-- 예제 13) 이름의 두번 째 글자가 'A'인 사원 조회하기
-- LIKE기호 : %(키워드를 제외한 어떤 문자열을 의미)
--         : _(키워드를 제외한 어떤 한 문자를 의미)
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '_A%';

-- 연습 6) 이름의 세번 째 글자가 'A'인 사원 조회하기
SELECT * FROM EMPLOYEE
WHERE ENAME LIKE '__A%';

-- 예제 14)IN, BETWEEN 의 반대를 나타낼 때 NOT 앞에 붙여서 사용했음
-- LIKE의 반대를 나타낼 때 똑같이 사용할 수 있음 : NOT LIKE
-- 이름에 A가 포함되지 않는 사람을 조회하세요
SELECT * FROM EMPLOYEE
WHERE ENAME NOT LIKE '%A%';

📌 NULL 검색

-- 6) NULL 검색(조회)
-- 예제 15) 상여금(COMMISSION)이 NULL 인 사원을 조회하세요
-- NULL의 특징 : 연산/비교 모든 것이 안됨 -> 결과는 NULL
-- 예약어 : NULL 조회시 : WHERE 컬럼명 IS NULL;
SELECT * FROM EMPLOYEE
WHERE COMMISSION IS NULL;

-- IN과 BETWEEN, LIKE의 반대는 앞에 NOT
-- IS NOT NULL이 존재함
SELECT * FROM EMPLOYEE
WHERE COMMISSION IS NOT NULL;

📌 ORDER BY 정렬


-- 7) ORDER BY : 정렬 기능
-- 예제 16) 사원 테이블을 오름차순으로 정렬하세요
-- 사용법 ) SELECT 컬럼명 FROM 테이블명
--         ORDER BY 정렬대상컬럼 ASC/DESC;
-- 참고) 이 기능을 사용하면 성능이 대폭 저하
SELECT * FROM EMPLOYEE
ORDER BY SALARY ASC; -- ASC(오름차순, 생략가능)

-- 내림차순으로 정렬
SELECT * FROM EMPLOYEE
ORDER BY SALARY DESC; -- DESC(내림차순, 생략불가)

-- 연습7) 사원 테이블에서 사원명으로 오름차순 정렬
SELECT * FROM EMPLOYEE
ORDER BY ENAME;

-- 연습8) 입사일 데이터로 내림차순 정렬
SELECT * FROM EMPLOYEE
ORDER BY HIREDATE DESC;

-- 연습9) 사원테이블에서 급여는 내림차순으로 정렬하고, 사원명은 오름차순으로 정렬
SELECT * FROM EMPLOYEE
ORDER BY SALARY DESC, ENAME ASC;

 

반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본  (0) 2023.09.08
반응형

📌 SQL 기본이론

-- sql-developr 툴 : DB 접속 툴(== DB 클라이언트 툴)
-- oracle 설치     : DB 서버
-- DB서버 <- 사용자가 접속해서 사용함(계정/암호)
-- system 계정 : 관리자( 계정생성, 권한관리 또는 DB 환경관리용으로 사용)
-- scott 계정  : 개발자(사용자) 계정 -> 벡엔드 개발을 진행함
-- sql-developer 툴 단축키 :
-- 1) 주석              : ctrl + /
-- 2) 커서 위치 한줄 실행 : ctrl + enter (아이콘 : 삼각형)
-- 3) 여러 줄 실행       : f5           (아이콘 : 문서 + 삼각형)
-- SQL 질의문(query)특징 : 대소문자 구분 없음(오라클 DB : 대문자가 성능이 빠름)
-- DB(데이터베이스) : 데이터를 관리 또는 저장하기 위한 최소단위 : 테이블
-- 1) SQL 문 : 검색(조회): SELECT ~ FROM 문
-- 사용법) SELECT 컬럼명, 컬럼명2... FROM 테이블명;
--                * : 모든 컬럼

DEPARTMENT

EMPLOYEE

📌 전체를 의미하는 *

 
SELECT * FROM DEPARTMENT; -- 전체부서를 조회하는 쿼리(질의문)
 
 

-- 예제 1) 사원테이블의 모든 컬럼 정보를 보기
SELECT * FROM EMPLOYEE;
 

📌 SELECT (컬럼명....) FROM 테이블명 : 해당 테이블에서 해당 컬럼만 조회


-- 예제 2) 사원테이블의 컬럼 중 ENO, ENAME 컬럼만 정보를 보기
SELECT ENO, ENAME FROM EMPLOYEE;

-- 예제 3) 부서테이블의 컬럼 중 DNO, LOC 컬럼만 조회하기
SELECT DNO, LOC FROM DEPARTMENT;

-- 예제 4) 힌트) 컬럼에 (/, +, -:) 연산자 사용해보기
-- 사원테이블 : EMPLYOEE
-- 월급 : SALARY
-- 사원명 : ENAME
-- 사원 테이블에서 사원명과 1년 연봉을 화면에 출력해보세요
SELECT ENAME ,(SALARY*12) FROM EMPLOYEE;

-- 예제 5) 사원테이블에서 사원이름과 커미션을 더한 연봉 구하기
SELECT ENAME,(SALARY*12)+COMMISSION FROM EMPLOYEE;

-- 예제 5-2) 위의 데이터 값 보정하기
-- NULL 특징 : NULL과 산술연산을 할 수 없음 (결과 : NULL)
-- 함수 : 사용법 : NVL(NULL 값이 있는 컬럼, 변경될 값)
SELECT ENAME,(SALARY*12)+NVL(COMMISSION, 0) FROM EMPLOYEE;

📌 alias : 컬럼에 별칭 붙이기


-- 예제 6) 컬럼에 별명(별칭) 붙이기
-- 사용법) SELECT 컬럼명 AS 별명 FROM 테이블명;
SELECT ENAME,(SALARY*12)+NVL(COMMISSION, 0) AS 연봉 FROM EMPLOYEE;

-- 예제 6-2) 별명에 공백을 넣어서 사용하기 : ""(쌍따옴표 사용)
SELECT ENAME,(SALARY*12)+NVL(COMMISSION, 0) AS "연        봉" FROM EMPLOYEE;

📌 중복을 제거하는 DISTINCT


-- 예제 7) 중복된 데이터를 한번씩만 출력하게 하는 예제
-- 사용법) SELECT DISTINCT 중복컬럼명 FROM 테이블명;
-- 사원테이블에 부서번호(DNO)를 중복을 제거해서 화면에 출력하기
SELECT DISTINCT DNO FROM EMPLOYEE;

-- 비교) 원본 DNO 질의문
SELECT DNO FROM EMPLOYEE;

📌 테스트 테이블 DUAL


-- 예제 8) 간단한 산술연산 및 테스트 용도 테이블 소개
-- DUAL 테이블 : 테스트용 테이블
SELECT * FROM DUAL;

-- 활용도)
SELECT 4*5+1 FROM DUAL;
-- SQL 문의 문자열 : '문자열' : 홑따옴표 사용
SELECT '홍길동' FROM DUAL;
-- 오늘 날짜 : SYSDATE 속성
SELECT SYSDATE FROM DUAL;
반응형

'SQL > SQL_이론' 카테고리의 다른 글

TABLE_CUD  (0) 2023.09.14
SUBQUERY  (0) 2023.09.14
그룹함수  (0) 2023.09.14
오라클 내장함수  (0) 2023.09.08
SQL 기본(2)  (0) 2023.09.08
반응형

읽기전용(read only)


 // TODO: 1) 읽기 전용(readonly) : 값 수정 불가
    interface IHello {
        readonly name: string
    }

    let val: IHello = { name: "hello"}; // 초기값 정의
    // val.name = "hello2"; // 변경불가 (readonly)

 

read only 변수에 값을 변경할 수 없음

튜플(tuple)


 // TODO: 2) 튜플(tuple) : 정해진 자료형의 고정된 크기의 배열
    let tuple: [string, number] = ["a", 1];
    console.log("tuple", tuple);
    // tuple = ["a", 1, 2]; // 값이 3개가 들어와서 에러
    // tuple = [1, "a"]; // 자료형 순서가 맞지 않음 에러

결과값
값이 3개가 들어와서 에러가 발생함
자료형 순서가 맞지 않는 경우

 

 

enum : 열거형, 상수를 대체해서 사용


  // TODO: enum : 열거형, 상수를 대체해서 사용함
  // TODO: 아래 상수에 자동으로 0 ~ n 1씩 증가되어 저장됨, 값도 직접 지정 가능
  enum Week {
    Sun,        // Sun = 0을 할당함
    Mon,        // Mon = 1
    Tue,        // Tue = 2
    Wed = 5,    // Wed = 5 (개발자가 강제로 값을 저장)
    Thu,        // Thu = 6
    Fri,        // Fri = 7
    Sat,        // Sat = 8
  }
  console.log("Week", Week);
  console.log("Week", Week.Sun);

 

사용자지정 타입


  • 여러 타입을 변수에 저장해서 사용자지정 타입으로 만들기
// TODO: 4) 별명 붙이기
  // TODO: 사용법 : type 별명 = 자료형 | 자료형2 ...
  // TODO: let 변수명 : 별명 = 값;
  type aliasUser = string | number;
  let person : aliasUser = "hong";
  console.log(person);

타입추론


// TODO: 5) 타입추론 : 모든 변수에 자료형을 지정하지않아도 값으로 추론하는 기능을 부여

  // TODO: (1) 변수의 초기값 : 생략가능
  let num = 10;     // 사용가능

  // TODO: (2) 기본값이 있는 매개변수 : 생략가능
  // 모던자바스크립트 사용법 : function 함수명(매개변수, 매개변수2 = 0){}
  // 함수의 사용 : 함수명(1) => 함수명(1, 0)    
  function add(a:number, b = 0):number {
    return a + b;
  }

  // TODO: (3) 리턴자료형은 함수에서 생략가능
  function add2(a:number, b = 0) {
    return a + b;
  }

 

타입(자료형) 단언


  // TODO: 6) 타입(자료형) 단언 :
  // TODO: 활용 : 컴퓨터는 알 수 없으나 개발자는 확실히 그 변수의 자료형을 확신하면 사용가능
  // TODO: 사용법 : 변수 as 자료형
  function someFunc(val: string | number, isNumber: boolean) {
    // 가정 : isNumber 가 true이면 무조건 val 값은 정수가 된다고 확신
    if (isNumber === true) {
      (val as number).toFixed(2);
    }
  }
반응형

'React > 이론' 카테고리의 다른 글

typescript - 함수  (0) 2023.09.06
typescript  (0) 2023.09.06
메모이제이션  (0) 2023.09.02
State(useState)  (0) 2023.08.31
리액트의 조건문 : 삼항연산자를 사용한 예제  (0) 2023.08.31
반응형

typescript에서의 함수 정의


// Func.tsx

import React from "react";
import { useState } from "react";

function Func() {
  // TODO: 변수 정의
  let [name, setName] = useState<string>("");
  let [message, setMessage] = useState<string>("");

  // TODO: 함수 정의 : 타입스크립트 적용
  // 매개변수 2개를 전달받아 message 변수에 저장하는 함수
  // getInputVal("안녕하세요", 2023)
  // TODO: 사용법 : const 함수명 = (매개변수: 자료형, ...): 리턴자료형 => {}
  const getInputVal = (arg: string, year: number): void => {
    setMessage(`${arg} 현재는 ${year} 년도 입니다.`); // message(화면 바인딩)
  };

  // 역바인딩(이벤트) 함수 정의
  // TODO: const 함수명 = (event:이벤트자료형...): 함수리턴자료형 => {};
  const onChangName = (event: React.ChangeEvent<HTMLInputElement>): void => {
    setName(event.target.value);
  };

  return (
    <div className="container">
      <input
        className="form-control mt-3 mb-3 w-25"
        type="text"
        name="name"
        value={name}
        onChange={onChangName}
      />
      입력값 : {name}
      <br />
      {/* react 아래 onClick={함수명} // 매개변수가 없는 함수 */}
      {/* TODO: 이벤트 함수에 매개변수가 있으면 화살표함수를 사용해야함 */}
      {/* react 아래 onClick={()=>{함수명(매개변수, 매개변수2)}} // 매개변수가 있는 함수는 화살표함수사용 */}
      <button
        className="btn btn-primary mt-3 mb-3"
        onClick={() => getInputVal("안녕하세요", 2023)}
      >
        입력값
      </button>
      <br />
      {message}
    </div>
  );
}

export default Func;
매개변수를 전달받는 함수정의

const 함수명 = (매개변수:자료형...):리턴자료형 => { };

 

역바인딩(이벤트) 함수 정의

const 함수명 = (event:이벤트자료형) :리턴자료형 => { };

 

이벤트자료형을 쉽게 알아내는 방법

  • html 태그 쪽에 있는 onChange에 마우스를 올리면 VScode에서 이벤트자료형을 추천해주는데 위의 붉은색 박스부분을 복사합니다.

  • 복사한 내용을 역바인딩 함수의 이벤트 자료형에 붙혀줍니다.
  • 단 ChangeEventHandler 부분의 Handler 부분은 삭제해줍니다.

 

연습문제


위의 화면처럼 출력해봅시다.

[부트스트랩 cdn]

    <!-- bootstrap css link -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous">

function FuncExam() {
return (
    <div className="container">
      <input
        className="form-control mt-3 mb-3 w-25"
        type="password"
        name="password"
        value={password}
        onChange={onChangPassword}
      />
      입력값 : {password}
      <br />
      <button
        className="btn btn-primary mt-3 mb-3"
        onClick={() => getInput("안녕하세요", 4, true)}
      >
        입력값
      </button>
      <br />
      {message}
    </div>
  );
}

export default FuncExam;

 

[정답]

  let [password, setPassword] = useState<string>("");
  let [message, setMessage] = useState<string>("");

  const getInput = (arg: string, day: number, bool: boolean): void => {
    setMessage(`${arg} 오늘날짜는 ${day} 일이 맞나요? 답은 ${bool} 입니다.`);
  };

  const onChangPassword = (
    event: React.ChangeEvent<HTMLInputElement>
  ): void => {
    setPassword(event.target.value);
  };
반응형

'React > 이론' 카테고리의 다른 글

typescript - etc  (1) 2023.09.06
typescript  (0) 2023.09.06
메모이제이션  (0) 2023.09.02
State(useState)  (0) 2023.08.31
리액트의 조건문 : 삼항연산자를 사용한 예제  (0) 2023.08.31
반응형

VS code에서 타입스크립트 프로젝트 생성방법


  • 폴더 생성 후 폴더 안에서 터미널 실행
  • 터미널에 npx create-react-app 프로젝트명 --template typescript 명령어 입력
  • 생성이 완료되면 리액트 서버 실행명령어 입력 npm start

프로젝트 생성완료가 되고 리액트 서버를 실행하면 위의 메시지가 출력됩니다.

typescript?


자바스크립트는 자료형을 정의하지 않고 자유롭게 변수에 값을 넣어 코딩이 가능합니다. 즉, 코딩이 간략하고 코딩생산성이 증가하지만 코딩시 에러를 잡지 못하고 서비스때 심각한 오류가 발생합니다.

 

즉 자바스크립트의 자료형을 명시해서 코딩하게 해주는 JS의 확장 언어를 타입스크립트라 합니다.

 

// Basic.tsx : 자식 컴포넌트(typescript 적용된 버전)
// rfce
import React, { useState } from 'react'
// 새로운 객체타입(자료형) 정의한 파일 import
import IObject from './../types/IObject';

function Basic() {
    // TODO: 타입스크립트 기본 사용법 익히기
    // 타입스크립트 바인딩 변수
    // 사용법 : let [변수명, set변수명] = useState<자료형>(초기값);
    let [message, setMessage] = useState<string>("바인딩 변수 출력입니다.");
    let [num, setNum] = useState<number>(0);
    let [bflag, setBflag] = useState<boolean>(true);
    let [obj, setObj] = useState<IObject>({id: null, name:"green"});
    let [arr, setArr] = useState<Array<number>>([1, 2, 3, 4, 5]);
    let [objArr, setObjArr] = useState<Array<IObject>>([{id: null, name: "green"}]);
   
    // TODO: 1) 기본자료형 : 문자열(string), 숫자(number), 참/거짓(boolean), 객체(따로정의)
    // 타입스크립트 일반 변수 정의
    // 사용법 : let 변수명: 자료형 = 값;
    let message2: string = "일반 변수 출력입니다."; // 문자열
    let num2: number = 1; // 숫자형(실수, 정수 모두 포함)
    let bflag2: boolean = false; // 참/거짓(bool, boolean)

    // TODO: 객체는 자료형을 개발자가 따로 정의해서 사용함
    // 사용법 let 변수명: 정의한객체파일명 = {속성:값...};
    // IObject = {id?: any(null제외한 어떤 자료형도 가능) | null, name: string(문자열만 가능)}
    // id는 모든 자료형 허용 또는 null 자료형도 허용 / name은 문자열만 허용
    let obj2: IObject  = {id: null, name:"green2"};   // 객체(object)

    // TODO: 2) 유니온 사용법 : let 변수명: 자료형(type) | 자료형2 ...
    let num3: number | string = 1;
    let num4: number | string = "hello";
    // let num5: number | string = true; // 에러 발생

    // TODO: 3) 옵셔널(?) : 객체의 속성이나 함수의 매개변수에 사용가능
    // TODO: 사용하면 오류없이 실행되게 함(자료형 | undefined 더 붙은 것과 같은 의미)
    function hello(name?: string) {
        console.log(`안녕하세요 ${name}`);
    }

    // 함수의 사용
    hello("홍길동"); // 안녕하세요 홍길동
    hello();        // 안녕하세요

    // TODO: 4) 배열 : let 변수: Array<자료형 | 자료형2 ...>
    // TODO: 변수 및 함수 사용 시 반드신 정의된 자료형의 값으로 사용하게 강제함
    let arr2: Array<string> = ["a", "b", "c"];     // 문자열 배열
    let arr3: Array<any> = [1, 2, 3];              // 모든 자료형 사용가능
    let arr4: Array<number> = [1, 2, 3];           // 숫자형 사용가능
   
    // TODO: 객체 배열
    let objArr2: Array<IObject> = [{ id: 1, name: "green2"}]; // JSON 문서 형태(객체배열)

  return (
    <div>
        문자(일반) : {message2}<br/>
        문자(바인딩) : {message}<br/>

        숫자형(일반) : {num2}<br/>
        숫자형(바인딩) : {num}<br/>

        boolean형(일반) : {bflag2? "참":"거짓"}<br/>
        boolean형(바인딩) : {bflag? "참":"거짓"}<br/>

        객체형(일반) : {obj2.name}<br/>  
        객체형(바인딩) : {obj.name}<br/>  

        배열(일반) : {arr2}<br/>  
        배열(바인딩) : {arr}<br/>

        {/* 객체배열은 반복문으로 출력 : .map((value, index)=>{}) */}
        객체배열(일반) : {objArr2.map((value)=>value.name)}<br/>  
        객체배열(바인딩) : {objArr.map((value)=>value.name)}<br/>  



    </div>
  )
}

export default Basic

객체형의 경우 개발자가 따로 정의를 해주어야 합니다.

 

// types폴더 > IObject.ts 객체 자료형을 정의하는 파일
// TODO: 타입스크립트 파일명 종류 : .tsx(jsx표현식을 사용한 js), .ts(jsx 표현식을 사용 안 한 js파일)
// TODO: 리액트의 JSX(Javascript and XML) : {값}
// 사용법
// export default interface 객체자료형명 {
//                  속성 : 자료형 | 자료형2 ...,
//                  속성2 : 자료형
// }
// 속성? : 옵셔널(?) : 속성이 없어도 오류 없이 실행되게 해줌
// 예) let obj: IObject = { name: "홍길동"}
//    obj.id (결과는 오류로 출력되지만 에러없이 프로그램이 실행되게 해줌)
export default interface IObject {
    id?: any | null,
    name: string
}

 

연습문제


// BasicExam.tsx : 자식컴포넌트
import React from "react";
import { useState } from "react";

function BasicExam() {
  let [message, setMessage] = useState<string>(
    "안녕하세요 그린컴퓨터아카데미입니다."
  );
  let [message2, setMessage2] = useState<string>("아래는 곱셈 샘플입니다.");
  let [message3, setMessage3] = useState<string>("곱셈");
  let [num, setNum] = useState<number>(2);
  let [num2, setNum2] = useState<number>(3);
  let [result, setResult] = useState<number>(num * num2);

  return (
    <div>
      {/* 아래 처럼 바인딩 변수를 사용해서 화면 출력을 하되 타입스크립트 코드를 적용하여 출력하세요
        단, 문자는 string , 숫자는 number 를 사용해서 코딩하세요
        */}
      {/* 결과 :
                안녕하세요 그린컴퓨터아카데미입니다.
                아래는 곱셈 샘플입니다.
                곱셈
                2 * 3 = 6
               
         */}
      {message}
      <br />
      {message2}
      <br />
      {message3}
      <br />
      {`${num} * ${num2} = ${result}`}
      <br />
    </div>
  );
}

export default BasicExam;

반응형

'React > 이론' 카테고리의 다른 글

typescript - etc  (1) 2023.09.06
typescript - 함수  (0) 2023.09.06
메모이제이션  (0) 2023.09.02
State(useState)  (0) 2023.08.31
리액트의 조건문 : 삼항연산자를 사용한 예제  (0) 2023.08.31
반응형

React.memo


컴포넌트, 변수, 함수 등을 재렌더링 할 때 제어가 필요한 경우 메모이제이션을 수행합니다.

 

메모이제이션이란 이전 처리 결과를 저장해둠으로써 처리속도를 높이는 기술입니다.

 

즉, 필요할 때만 다시 계산하게 하여 불필요한 처리를 줄입니다.

 

컴포넌트를 메모이제이션해서 부모 컴포넌트가 재렌더링되더라도 자식 컴포넌트의 재렌더링을 방지합니다.

 

리액트 내의 memo를 사용하며 import를 해주어야 합니다 사용법은 컴포넌트 함수 전체를memo() 로 감싸면 됩니다.

 

 

[App.js]

import { useState, memo } from "react";
import { Child1 } from "./components/Child1";
import { Child4 } from "./components/Child4";

//TODO: React.memo
// 리액트에서 컴포넌트, 변수, 함수 등을 재렌더링할 때 제어가 필요한 경우 메모이제이션을 수행
// 메모이제이션 : 이전 처리 결과를 저장, 처리속도를 높이는 기술, 필요할 때만 다시 계산하게 하여 불필요한 처리를 줄일 수 있음
// 사용법 : const 컴포넌트명 = memo(()=>{});
//         import memo from "react";

export const App = memo(() => {
  // 컴포넌트를 괄호로 감싸면 해당 컴포넌트는 props에 변경이 있을 때만 재렌더링됨
  console.log("App 렌더링");

  const [num, setNum] = useState(0);

  const onClickButton = () => {
    setNum(num + 1);
  };


  return (
    <>
      <button onClick={onClickButton}>버튼</button>
      <p>{num}</p>
      <Child1  />
      <Child4 />
    </>
  );
});

export default App;

[Child 1, 2, 3, 4]

import {Child2} from "./Child2";
import {Child3} from "./Child3";
import {memo} from "react";

const style = {
    height : "200px",
    backgroundColor : "lightblue",
    padding : "8px"
};

export const Child1 = memo((props) => {
    console.log("Child1 렌더링");
 

    return (
        <div style={style}>
            <p>Child 1</p>
            <Child2 />
            <Child3 />
        </div>
    );
 });
import {memo} from "react";
const style = {
  height: "50px",
  backgroundColor: "lightgray",
};

export const Child2 = memo(() => {
  console.log("Child2 렌더링");

  return (
    <div style={style}>
      <p>Child2</p>
    </div>
  );
});
import {memo} from "react";
const style = {
  height: "50px",
  backgroundColor: "lightgray",
};

export const Child3 = memo(() => {
  console.log("Child3 렌더링");

  return (
    <div style={style}>
      <p>Child3</p>
    </div>
  );
});
import {memo} from "react";
const style = {
  height: "200px",
  backgroundColor: "wheat",
  padding: "8px",
};

export const Child4 = memo(() => {
  console.log("Child4 렌더링");

  return (
    <div style={style}>
      <p>Child4</p>
    </div>
  );
});

[실행결과]

* 상단 버튼을 누르면 부모 컴포넌트인 App 부분만 재렌더링 되는 것을 볼 수 있으며 자식 컴포넌트 Child 1, 2, 3, 4는 재렌더링 되지 않는 것을 알 수 있습니다.

 

useCallback


memo를 사용해 컴포넌트를 메모이제이션 할 수 있습니다.

이번에는 함수 메모이제이션을 알아봅시다!

 

먼저 Child1에 리셋 버튼을 생성합니다.

리셋 버튼을 클릭하면 카운트 수치를 0으로 되돌리는 기능을 추가하면 됩니다.

카운트 수치의 state는 부모 컴포넌트인 App 이 가지고 있기 때문에 App 안에서 리셋하기 위한 함수를 정의하고 그 함수를 Child1에 전달하는 방식으로 구현합니다.

 

[App.js]

import { useState, memo } from "react";
import { Child1 } from "./components/Child1";
import { Child4 } from "./components/Child4";

//TODO: React.memo
// 리액트에서 컴포넌트, 변수, 함수 등을 재렌더링할 때 제어가 필요한 경우 메모이제이션을 수행
// 메모이제이션 : 이전 처리 결과를 저장, 처리속도를 높이는 기술, 필요할 때만 다시 계산하게 하여 불필요한 처리를 줄일 수 있음
// 사용법 : const 컴포넌트명 = memo(()=>{});
//         import memo from "react";

export const App = memo(() => {
  // 컴포넌트를 괄호로 감싸면 해당 컴포넌트는 props에 변경이 있을 때만 재렌더링됨
  console.log("App 렌더링");

  const [num, setNum] = useState(0);

  const onClickButton = () => {
    setNum(num + 1);
  };

  // 리셋함수 정의
  const onClickReset = () => {
    setNum(0);
   };

  return (
    <>
      <button onClick={onClickButton}>버튼</button>
      <p>{num}</p>
      {/* Child1에 props로 클릭함수를 전달 */}
      <Child1 onClickReset={onClickReset} />
      <Child4 />
    </>
  );
});

export default App;

[Child1.js]

import {Child2} from "./Child2";
import {Child3} from "./Child3";
import {memo} from "react";

const style = {
    height : "200px",
    backgroundColor : "lightblue",
    padding : "8px"
};

export const Child1 = memo((props) => {
    console.log("Child1 렌더링");

    // props로 부터 함수를 전개
    const {onClickReset} = props;

    return (
        <div style={style}>
            <p>Child 1</p>
            {/* onClick 속성 추가하고 함수 값 넣기 */}
            <button onClick={onClickReset}>리셋</button>
            <Child2 />
            <Child3 />
        </div>
    );
 });

[실행결과]

그러나 앞에서 최적화했던 재렌더링을 다시 확인해보면 카운트 업 할때마다 Child1이 재렌더링 되는 것을 알 수 있습니다.

함수를 Props에 전달할 때 컴포넌트를 메모이제이션해도 재렌더링되는 것은 

함수가 다시 생성되기 때문입니다. 일반적으로 우리가 함수를 정의할 때는 아래와 같이 정의합니다.

  // 리셋함수 정의
  const onClickReset = () => {
    setNum(0);
   };

 

이렇게 함수를 정의하면 재렌더링 등으로 코드가 실행될 때마다 항상 새로운 함수가 다시 생성됩니다.

따라서 함수를 Props로 받는 Child1 은 Props가 변화했다고 판정해 카운트업 할 때마다 재렌더링을 하게 되는 것입니다.

이 현상을 피하기 위해서는 함수에 메모이제이션을 해주어야 합니다.

 

리액트는 함수 메모이제이션 기능 useCallback을 제공합니다. useCallback은 첫번째 인수에 함수, 두번째 인수에 의존 배열을 받습니다.

 

그러면 Child1 에 리셋함수를 아래와 같이 변경해줍니다.

 

  // 리셋함수 정의 - useCallback 함수 사용
  const onClickReset = useCallback(() => {
    setNum(0);
   }, []);

 

변경 후 실행화면을 볼까요?

App 만 재렌더링되어 불필요한 재렌더링을 최적화하였습니다.

 

변수 메모이제이션


앞에서 컴포넌트 메모이제이션과 함수 메모이제이션에 대해 알아보았습니다.

기본적으로 이 두가지를 사용하면 불필요한 재렌더링을 제어할 수 있습니다. 

 

React.useMemo

memo나 useCallback 만큼은 자주사용하지는 않지만 리액트에서는 변수 메모이제이션으로 useMemo를 제공합니다.

useMemo 사용법은 아래와 같습니다.

 

   // 변수 메모이제이션
   const 변수명 = useMemo(()=>{
    // 실행부분 - 함수에 변수에 설정할 값의 반환
   },[의존배열]);
반응형

'React > 이론' 카테고리의 다른 글

typescript - 함수  (0) 2023.09.06
typescript  (0) 2023.09.06
State(useState)  (0) 2023.08.31
리액트의 조건문 : 삼항연산자를 사용한 예제  (0) 2023.08.31
map, filter  (0) 2023.08.31
반응형

State


리액트에서는 화면에 표시하는 데이터나 길이가 변하는 상태 등을 모두 State로 관리합니다.

웹 애플리케이션을 만들 때 화면은 다양한 상태를 가집니다. 예시는 다음과 같습니다.

  • 에러가 있는가?
  • 모달 창을 열고 있는가?
  • 버튼을 클릭했는가?
  • 텍스트 박스에 무언가를 입력했는가?

이와 같이 '상태'는 모두 State로 관리하며 이벤트가 실행되는 경우 등에 업데이트 처리를 수행함으로써 동적 애플리케이션을 구현합니다.

 

useState


useState는 리액트 안에서 제공되므로 사용할 때는 import해야 합니다.

 

import { useState } from "react";

useState 함수 반환값은 배열형태로 되어 있습니다. 첫번째에 State 변수, 두번째에 State를 업데이트하기 위한 함수가 설정됩니다.

 

  // State 정의
  const [변수명, set변수명] = useState(초기값);

버튼 클릭시 카운트업하는 기능을 구현해보겠습니다.

 

import { ColoredMessage } from "./components/ColoredMessage";
import { useState } from "react";

export const App = () => {
  // State 정의
  const [num, setNum] = useState(0);
 
  // 버튼 클릭 시 state를 카운트 업
  const onClickButton = () => {
    setNum(num + 1);
  };

 

 

  return (
    <>
      <h1 style={{ color: "red" }}>안녕하세요</h1>
      <ColoredMessage color="blue" message="잘 지내시죠?" />
      <ColoredMessage color="pink" message="잘 지냅니다!" />
      <button onClick={onClickButton}>버튼</button>
      {/* 아래에 카운트 변수 추가 */}
      <p>{num}</p>
    </>
  );
};

export default App;

반응형

'React > 이론' 카테고리의 다른 글

typescript  (0) 2023.09.06
메모이제이션  (0) 2023.09.02
리액트의 조건문 : 삼항연산자를 사용한 예제  (0) 2023.08.31
map, filter  (0) 2023.08.31
리액트 컴포넌트의 생명주기(LifeCycle) : 생성/수정  (0) 2023.08.30
반응형

ul-li 태그 반복하여 출력하기

function H_Book() {
   
  const students = [
    {
      id: 1,
      name: "Inje",
    },
    {
      id: 2,
      name: "Steve",
    },
    {
      id: 3,
      name: "Bill",
    },
    {
      id: 4,
      name: "Jeff",
    },
  ];

  //   변수정의
  const [student, setStudent] = useState(students);

  return (
    <div>
      <ul class="list-group">
        {/* 반복문 : 여기서 돌리면 됨 */}
        {student.map((value, index) => {
          return (
          <li class="list-group-item">{value.name}</li>
          );
        })}
      </ul>
    </div>
  );
}

export default H_Book;

 

반응형

'React > 실습' 카테고리의 다른 글

삼항연산자를 이용한 실습  (0) 2023.08.31
조건문을 활용한 예제  (0) 2023.08.31
반복문을 활용한 예제  (0) 2023.08.31
useState 이용 4가지 변수 넣기  (0) 2023.08.31
useState 함수를 이용한 Comment 출력  (0) 2023.08.31
반응형

아래 변수에 값이 있다. isFull 이 true 이면 <p style={{ color: "red" }}>정원이 가득찼습니다.</p> 아니면 <p style={{ color: "blue" }}>입장할 수 있습니다.</p> 를 출력하세요.
import React from "react";
import { useState } from "react";

function E_ComfirmButton_Exam() {

  let [isFull, setIsFull] = useState(false);

  const display = () => {
    setIsFull(true);
  };

  return (
    <div>
      <button onClick={display} className="btn btn-warning">
        {(isFull === true) ? (
          <p style={{ color: "red" }}>정원이 가득찼습니다.</p>
        ) : (
          <p style={{ color: "blue" }}>입장할 수 있습니다.</p>
        )}
      </button>
    </div>
  );
}

export default E_ComfirmButton_Exam;

아래 변수 count 에 9 의 값이 있다.  10을 초과하면 ( count>10 ) <p style={{ color: "red" }}>정원이 가득찼습니다.</p>아니면 <p style={{ color: "blue" }}>입장할 수 있습니다.</p> 를 출력하세요.
function F_ConfirmButton_Exam2() {
    let [count, setCount] = useState(9);  // 변수선언
    const addCount = () => {  // 클릭이벤트 함수 => 클릭시  카운트 증가
        let val = count + 1;
        setCount(val);
     }

  return (
    <div>
        현재 정원 : {count}
        <br/>
        <button onClick={addCount}  disabled={((count > 10) === true) ? true : false}> 카운트 수가 10 초과하면 버튼 비활성화
           {
            (count > 10) === true ? <p style={{ color: "red" }}>정원이 가득찼습니다.</p> : <p style={{ color: "blue" }}>입장할 수 있습니다.</p>
           }
        </button>
    </div>
  )
}

 

 

onClickLogout 함수는 클릭하면 isLoggedIn 변수의 값을 true -> false 로 변경한다.
onClickLogIn 함수는 클릭하면 isLoggedIn 변수의 값을 false -> true로 변경한다.
코딩을 완성해보세요.
function G_LandingPage() {
    // TODO: 변수 정의
    const [isLoggedIn, setIsLoggedIn] = useState(false);   // 초기값 false
    // TODO: 함수 정의
    // nfn
    const onClickLogin = () => {
        // TODO: 아래 코딩하세요
        setIsLoggedIn(true);
       
     }
         // nfn
    const onClickLogout = () => {
        // TODO: 아래 코딩하세요
        setIsLoggedIn(false);
     }

  return (
    <div>
        {
            (isLoggedIn===true)? (
                <button onClick={onClickLogout}>로그아웃</button>
            ) : (
                <button onClick={onClickLogin}>로그인</button>
            )
        }
    </div>
  )
}

반응형

'React > 실습' 카테고리의 다른 글

반복문을 활용한 예제(2)  (0) 2023.08.31
조건문을 활용한 예제  (0) 2023.08.31
반복문을 활용한 예제  (0) 2023.08.31
useState 이용 4가지 변수 넣기  (0) 2023.08.31
useState 함수를 이용한 Comment 출력  (0) 2023.08.31
반응형

# TODO

아래 버튼을 클릭하면 문구가 확인하기 -> 확인됨으로 바뀌게 하고

버튼 상태를 비활성화 시켜보자.

 

#1 버튼의 상태를 변경할 변수값 선언

 

 // TODO: 변수정의
    let [isConfirmed, setIsConfirmed] = useState(false);

#2 버튼을 누르면 문구변경 / 상태변경 함수 정의

 

// TODO: 함수정의
    const handleConfirm = () => {
        setIsConfirmed(true);
     }

#3 문구부분을 삼항 연산자를 사용하여 변경

 

return (
    <div>
        <button onClick={handleConfirm}
                disabled={isConfirmed}
        >
            {
                (isConfirmed === true)? "확인됨" : "확인하기"  // button의 문구부분 -> 삼항연산자 사용
            }
        </button>
    </div>
  )

반응형

'React > 이론' 카테고리의 다른 글

메모이제이션  (0) 2023.09.02
State(useState)  (0) 2023.08.31
map, filter  (0) 2023.08.31
리액트 컴포넌트의 생명주기(LifeCycle) : 생성/수정  (0) 2023.08.30
CSS 적용  (0) 2023.08.30

+ Recent posts