728x90
SMALL

*아래 연습문제는 연습문제를 위한 견본데이터베이스가 있어야 실행 가능

★연습문제1

1. 상품관리(EC_Product) 테이블에서 단가가 100만원을 초과하는 상품 목록의 [상품코드, 상품명, 단가]를 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,UNIT_PRICE
FROM EC_Product
WHERE UNIT_PRICE >1000000;

2. 회원관리(EC_Member) 테이블로부터 서울에서 거주하는 회원의 [사용자아이디, 회원명, 주민등록번호, 주소]를 출력하시오.

더보기
SELECT USERID,NAME,REGIST_NO,ADDRESS
FROM EC_Member
WHERE ADDRESS LIKE '서울%';

3. 장바구니(EC_Basket) 테이블에서 2018년 07월 11일에 주문한 고객과 주문 내용을 출력하시오.

더보기
SELECT ORDER_NO, ORDER_ID, PRODUCT_CODE,ORDER_QTY,ORDER_DATE
FROM EC_Basket
WHERE ORDER_DATE='18/07/11';

4. 주문처리(EC_Order) 테이블에서 결제한 회원 중에서 상품을 배달하지 않은 회원의 [주문번호, 상품코드, 주문수량, 결제방법, 결제금액, 결제일자, 구분]을 주문번호순으로 출력하시오.

더보기
SELECT ORDER_NO, PRODUCT_CODE,ORDER_QTY,CSEL,CMONEY,CDATE,GUBUN
FROM EC_Order
WHERE GUBUN ='결제'  AND GUBUN != '배달' ;

5. 회원관리(EC_Member) 테이블에서 회원명에 '우'자가 들엉간 회원의 [회원ID, 회원명, 주민등록번호]를 출력하시오.

더보기
SELECT USERID, NAME,REGIST_NO
FROM EC_Member
WHERE NAME LIKE '%우%';

6. 주문처리(EC_Order) 테이블에서 배달한 주문자 중에서 '신용카드'로 결제하지 않은 주문자의 [주문번호, 주문자ID, 상품코드, 결제방법, 구분]을 주문자ID 순으로 출력하시오.

더보기
SELECT ORDER_NO, ORDER_ID, PRODUCT_CODE,CSEL,GUBUN
FROM EC_Order
WHERE GUBUN ='배달' AND CSEL !='신용카드'
ORDER BY 2;

7. 상품관리(EC_Product) 테이블에서 상품의 단가가 30만원에서 50만원 이내의 상품 목록의 [상품코드, 상품명, 단가, 재고수량, 생산처를 단가(Unit_Price)내림차순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE UNIT_PRICE BETWEEN 300000 AND 500000
ORDER BY 3 DESC;

8. 주문처리(EC_Order) 테이블에서 '신용카드'로 결제한 행의 [주문번호, 주문자ID, 결제금액, 결제일자, 결제방법]을 출력하시오.

더보기
SELECT ORDER_NO,ORDER_ID,CMONEY,CDATE,CSEL
FROM EC_Order
WHERE CSEL='신용카드';

9. 주문처리(EC_Order) 테이블에서 결제하지 않은 행의 [주문번호, 주문자ID, 상품코드, 주문수랴으 결제할 금액, 구분]을 출력하시오.

더보기
SELECT ORDER_NO,ORDER_ID,PRODUCT_CODE,ORDER_QTY,CMONEY,GUBUN
FROM EC_Order
WHERE GUBUN IS NULL;

10. 주문처리(EC_Order) 테이블에서 'usko' 회원의 거래한 상품의 [주문자ID, 상품코드, 주문수량, 결제방법, 결제금액, 구분]을 출력하시오.

더보기
SELECT ORDER_ID,PRODUCT_CODE,ORDER_QTY,CSEL,CMONEY,GUBUN
FROM EC_Order
WHERE ORDER_ID = 'usko';

★연습문제2

1. 상품관리(EC_Product) 테이블에서 삼성(samsung) 회사의 제품의 [상품코드, 상품명, 단위, 단가, 재고수량, 생산처]를 상품명순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE COMPANY IN('SAMSUNG','Samsung','samsung')
ORDER BY 2;

2. 상품관리(EC_Product) 테이블에서 '프린터' 제품의 단가(Unit_Price)가 50만원을 추과하는 상품의 [상품코드, 상품명, 단위, 단가, 재고수량, 생산처]를 단가 내림차순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD, UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE PRODUCT_NAME='프린터' AND Unit_Price >500000
ORDER BY 4 DESC;

3. 회원관리(EC_Member) 테이블에서 '정'씨 회원의 [회원명, 주민등록번호, 전화번호, 가입일자]를 출력하시오.

더보기
SELECT NAME,REGIST_NO,TELEPHONE,TIMESTAMP
FROM EC_Member
WHERE NAME LIKE '정%';

4. 주문처리(EC_Order) 테이블에서 '현금입금'과 '계좌이체'한 회원의 [주문번호, 상품코드, 결제방법, 결제일자]를 결제방법, 결제일자순으로 출력하시오.

더보기
SELECT ORDER_NO,PRODUCT_CODE,CSEL,CMONEY,CDATE
FROM EC_Order
WHERE CSEL IN('현금입금','계좌이체')
ORDER BY 3,5;

5. 상품관리(EC_Product) 테이블에서 'Hp' 회사의 '프린터' 제품에 대한 [상품코드, 상품명, 단위, 단가, 재고수량]을 단가순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,UNIT_PRICE,LEFT_QTY
FROM EC_Product
WHERE COMPANY='HP' AND PRODUCT_NAME='프린터'
ORDER BY 3;

6. 상품관리(EC_Product) 테이블에서 생산처가 '삼성(SAMSUNG)'과 'LG전자'가 아닌 상품의 [상품코드, 상품명, 단위, 단가, 재고수량, 생산처]를 생산처, 단가순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE COMPANY NOT IN ('SAMSUNG','Samsung','samsung','LG전자')
ORDER BY 6,4;

7. 회원관리(EC_Member) 테이블에서 주소가 '서울'과 '대구'가 아닌 회원의 [회원명, 주민등록번호, 전화번호, 주소]를 주소(Address)순으로 출력하시오.

더보기
SELECT NAME,REGIST_NO,TELEPHONE,ADDRESS
FROM EC_Member
WHERE ADDRESS NOT LIKE '서울%' AND ADDRESS NOT LIKE '대구%'
ORDER BY 4;

8. 상품관리(EC_Product) 테이블에서 재고수량이 10 미만인 상품의 [상품코드, 상품명, 규격, 단가, 재고수량, 생산처]를 상품명순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE LEFT_QTY <10
ORDER BY 2;

9. 회원관리(EC_Member) 테이블에서 전화번호가 '666'이 포함된 회원의 [회원명, 주민등록번호, 전화번호, 주소]를 회원명순으로 출력하시오.

더보기
SELECT NAME,REGIST_NO,TELEPHONE,ADDRESS
FROM EC_Member
WHERE TELEPHONE LIKE '%666%'
ORDER BY 1;

10. 회원관리(EC_Member) 테이블에서 2018년 5월 1일 이후에 가입한 회원의 [회원명, 주민등록번호, 전화번호, 주소, 가입일자]를 회원 가입일자(Timestape)순으로 출력하시오.

더보기
SELECT NAME,REGIST_NO, TELEPHONE, ADDRESS, TIMESTAMP
FROM EC_Member
WHERE TIMESTAMP >'2018/05/01'
ORDER BY 5;

11. 상품관리(EC_Product) 테이블에서 상품명이 '노트'로 시작하는 상품의 [상품코드, 상품명, 단위, 단가, 재고수량, 생산처]를 생산처순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE PRODUCT_NAME LIKE '노트%'
ORDER BY 6;

12. 상품관리(EC_Product) 테이블에서 'LG'로 시작하는 생산처의 상품이 80만원을 초과하는 [상품코드, 상품명, 단위, 단가, 재고수량, 생산처]를 상품코드순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE COMPANY LIKE 'LG%' AND UNIT_PRICE>800000
ORDER BY 1;

13. 상품관리(EC_Product) 테이블에서 생산처가 입력되지 않은 행의 [상품코드, 상품명, 단위, 단가, 재고수량, 생산처]를 상품코드순으로 출력하시오.

더보기
SELECT PRODUCT_CODE,PRODUCT_NAME,STANDARD,UNIT_PRICE,LEFT_QTY,COMPANY
FROM EC_Product
WHERE COMPANY IS NULL
ORDER BY 1;

14. 주문처리(EC_Order) 테이블에서 상품코드가 'CM01'이고 주문이 1개 초과 주문한 행의 [주문번호, 주문자ID, 상품코드, 주문수량, 결제금액]을 주문자ID순으로 출력하시오.

더보기
SELECT ORDER_NO,ORDER_ID,PRODUCT_CODE,ORDER_QTY,CMONEY
FROM EC_Order
WHERE Product_CODE='CM01' AND ORDER_QTY>1
ORDER BY 2;

15. 회원관리(EC_Member) 테이블에서 회원명이 '고'씨부터 '최'씨를 제외한 회원을 [회원명, 주민등록번호, 전화번호, 주소']를 회원명순으로 출력하시오.

더보기
SELECT NAME,REGIST_NO,TELEPHONE,ADDRESS
FROM EC_Member
WHERE NAME NOT BETWEEN '고' AND '쵸'
ORDER BY 1;

16. 수강(SG_Scores) 테이블에서 수강과목코드가 'L1011'과 'L1021' 과목의 학점을 취득한 학생의 [과목코드, 학번, 성적, 성적취득일자]를 과목코드, 학번순으로 출력하시오.

더보기
SELECT COURSE_ID, STUDENT_ID,SCORE,SCORE_ASSIGNED
FROM SG_Scores
WHERE COURSE_ID IN('L1011','L1021')
ORDER BY 1,2;

17. 수강(SG_Scores)테이블에서 성적이 80점 이상이 아닌 행의 [과목코드, 학번, 성적, 성적취득일자]를 출력하시오.

더보기
SELECT STUDENT_ID, COURSE_ID, SCORE,SCORE_ASSIGNED
FROM SG_Scores
WHERE NOT SCORE >=80;

18. 학생(Student) 테이블에서 학과코드가 '컴공',과 '경영'학과가 아닌 학생의 [학과코드, 학년, 학번, 성명, 전화번호]를 학과코드, 학번순으로 출력하시오.

더보기
SELECT DEPT_ID, YEAR, STUDENT_ID,NAME,TELEPHONE
FROM Student
WHERE DEPT_ID NOT IN('컴공','경영')
ORDER BY 1,3;
728x90
LIST
728x90
SMALL

★연습문제1

1-1. 표의 논리적 스키마를 참고하여 상품관리 테이블을 생성하시오.

칼럼명 영문명 데이터형 크기  NN 참조테이블
상품코드 Product_Code 문자형 10 NN PK  
상품명 Product_Name 문자형 20 NN    
규격 Standard 문자형 20      
단위 Unit 문자형 10      
단가 Unit_Price 숫자형 7 NN    
재고수량 Left_Qty 숫자형 5 NN    
생산처 Company 문자형 20      
상품이미지명 ImageName 문자형 20      
상품정보 Info 문잦형 50      
상세소개 Detail_Info 문자형 255      
더보기
CREATE TABLE EC_Product (
Product_Code VARCHAR2(10),
Product_Name VARCHAR2(20) NOT NULL,
Standard     VARCHAR2(20),
Unit         VARCHAR2(10),
Unit_Price   NUMBER(7)    NOT NULL,
Left_Qty     NUMBER(5)    NOT NULL,
Company      VARCHAR2(20),
ImageName    VARCHAR2(20),
Info         VARCHAR2(50),
Detail_Info  VARCHAR2(255),
CONSTRAINT EC_Product_pk PRIMARY KEY(Product_Code));

1-2. 표의 논리적 스키마를 참고하여 회원관리 테이블을 생성하시오.

칼럼명 영문명 데이터형 크기 NN 참조테이블
회원 ID UserID 문자형 10 NN PK  
회원비밀번호 Passwd 문자형 10 NN    
회원명 Name 문자형 10 NN    
주민등록번호 Regist_No 문자형 14 NN UK  
eMail 주소 Email 문자형 20      
전화번호 Telephone 문자형 13 NN    
주소 Address 문자형 40      
구매실적 Buycash 숫자형 9 기본값 0    
가입일자 Timestamp 날짜형   기본값 SYSDATE    
더보기
CREATE TABLE EC_Member (
UserID    VARCHAR(10),
Passwd    VARCHAR(10)   NOT NULL,
Name      VARCHAR(10)   NOT NULL,
Regist_No VARCHAR(14)   CONSTRAINT EC_Member_uk UNIQUE NOT NULL,
Email     VARCHAR(20),
Telephone VARCHAR(13)   NOT NULL,
Address   VARCHAR(40),
Buycash   NUMBER(9)     DEFAULT 0,
Timestamp DATE          DEFAULT SYSDATE,
CONSTRAINT EC_Member_pk PRIMARY KEY(UserID));

1-3. 표의 논리적 스키마를 참고하여 장바구니 테이블을 생성하시오.

칼럼명 영문명 데이터형 크기 NN 참조테이블
주문번호 Order_No 문자형 10 NN PK  
주문자 ID Order_ID 문자형 10 NN FK1 회원관리
상품코드 Product_Code 문자형 10 NN FK2 상품관리
주문수량 Order_Qty 숫자형 3 NN    
주문일자 Order_Date 날짜형   기본값 SYSDATE    
더보기
CREATE TABLE EC_Basket(
Order_No     VARCHAR(10),
Order_ID     VARCHAR(10) NOT NULL,
Product_Code VARCHAR(10) NOT NULL,
Order_Qty    NUMBER(3)   NOT NULL,
Order_Date   DATE        DEFAULT SYSDATE,
CONSTRAINT EC_Basket_pk  PRIMARY KEY(Order_No),
CONSTRAINT EC_Basket_fk1 FOREIGN KEY(Order_ID)     REFERENCES EC_Member(UserId),
CONSTRAINT EC_Basket_fk2 FOREIGN KEY(Product_Code) REFERENCES EC_Product(Product_Code));

1-4. 표의 논리적 스키마를 참고하여 주문처리 테이블을 생성하시오.

칼럼명 영문명 데이터형 크기 NN 참조테이블
주문번호 Order_No 문자형 10 NN PK  
주문자ID Order_ID 문자형 10 NN    
상품코드 Product_Code 문자형 10 NN    
주문수량 Order_Qty 숫자형 3 NN    
결제방법 Csel 문자형 10      
결제금액 CMoney 숫자형 9      
결제일자 Cdate 날짜형        
배달일자 Mdate 날짜형        
구분 Gubun 문자형 10      
더보기
CREATE TABLE EC_Order(
Order_No     VARCHAR2(10),
Order_ID     VARCHAR2(10) NOT NULL,
Product_Code VARCHAR2(10) NOT NULL,
Order_Qty    NUMBER(3)    NOT NULL,
Csel         VARCHAR2(10),
Cmoney       NUMBER(9),
Cdate        DATE,
Mdate        DATE,
Gubun        VARCHAR2(10),
CONSTRAINT EC_Order_pk PRIMARY KEY(Order_No));

2. 사용자가 생성한 테이블명을 모두 출력하시오.

더보기
SELECT * FROM TAB;

3. 장바구니(EC_Basket) 테이블의 구조를 출력하시오

더보기
DESC EC_Basket

4. 상품관리(EC_Product) 테이블의 상세소개(Detail_info) 칼럼을 삭제하시오.

더보기
ALTER TABLE EC_Product DROP COLUMN Detail_info;

5. 상품관리(EC_Product) 테이블의 상품정보(Info) 칼럼을 40자로 줄이시오.

더보기
ALTER TABLE EC_Product MODIFY(INFO VARCHAR2(40));

6. 주문처리(EC_Order) 테이블의 구분(Gubun) 칼럼을 20자로 늘리시오.

더보기
ALTER TABLE EC_Order MODIFY(Gubun VARCHAR2(20));

7. 주문처리(EC_Order) 테이블의 상품코드(Product_Code) 칼럼을 상품관리(EC_Product 테이블을 참조하여 외부 키를 추가하시오.

더보기
ALTER TABLE EC_Order
ADD CONSTRAINT EC_Order_fk
    FOREIGN KEY(Product_Code) REFERENCES EC_Product(Product_Code);

8. 주문처리(EC_Order) 테이블에 지정된 제약조건을 출력하시오.

더보기
SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,SEARCH_CONDITION
FROM USER_CONSTRAINTS
WHERE TABLE_NAME ='EC_ORDER';

9. 주문처리(EC_Order) 테이블에 지정한 제약조건명, 칼럼명, 복합칼럼(POSITION) 유무를 출력하시오.

더보기
SELECT CONSTRAINT_NAME,COLUMN_NAME,POSITION
FROM USER_CONS_COLUMNS
WHERE TABLE_NAME ='EC_ORDER';

★연습문제2

1. 표의 논리적 스키마를 참고하여 자유게시판(Board) 테이블을 생성하시오.

칼럼명 영문명 데이터형 크기 NN
게시물 번호 B_Id 숫자형 5 NN PK
등록자 B_Name 문자형 20 NN  
비밀번호 B_Pwd 문자형 20 NN  
이메일 주소 B_Email 문자형 20 NN  
제목 B_Title 문자형 80 NN  
내용 B_Content 문자형 2000 NN  
등록일자 B_Date 날짜형   기본값 SYSDATE  
조회수 B_Hit 숫자형 5 기본값 0  
IP 주소 B_Ip 문자형 15    

 

더보기
CREATE TABLE Board(
B_Id      NUMBER(5),
B_Name    VARCHAR2(20)   NOT NULL,
B_Pwd     VARCHAR2(20)   NOT NULL,
B_Email   VARCHAR2(20)   NOT NULL,
B_Title   VARCHAR2(80)   NOT NULL,
B_Content VARCHAR2(2000) NOT NULL,
B_Date    DATE           DEFAULT SYSDATE,
B_Hit     NUMBER(5)      DEFAULT 0,
B_IP      VARCHAR2(15),
CONSTRAINT Board_pk PRIMARY KEY(B_Id));

2. 표를 참고하여 답변형 게시판에 필요한 칼럼을 Board 테이블에 추가하시오.

칼럼명 영문명 데이터형 크기 NN
동일 게시물 참조번호 B_Ref 숫자형 5 기본값 0  
동일 게시물 단계번호 B_Step 숫자형 5 기본값 0  
동일 게시물 위치번호 B_Order 숫자형 5 기본값 0  
더보기
ALTER TABLE Board
ADD(B_Ref  NUMBER(5) DEFAULT 0,
    B_Step NUMBER(5) DEFAULT 0, 
    B_Order NUMBER(5) DEFAULT 0);

3. Board 테이블의 제목(B_Title) 칼럼 길이를 100자로 늘리시오

더보기
ALTER TABLE Board
MODIFY(B_TiTLE VARCHAR2(100));

4. Board 테이블의 비밀번호(B_Pwd) 칼럼을 NULL로 수정하시오.

더보기
ALTER TABLE Board
MODIFY(B_Pwd VARCHAR2(20) NULL);

5. Board 테이블의 IP 주소(b_ip) 칼럼을 삭제하시오

더보기
ALTER TABLE Board
DROP COLUMN B_Ip;

6. Board 테이블의 구조를 확인하시오

더보기
DESC Board

7. 회원관리(EC_Member) 테이블의 회원 ID(UserID) 칼럼에 영소문자(a부터 z까지)로 제한하시오. 체크 제한조건이 동작하는지 다음 INSERT문을 실행해 보시오.

INSERT INTO EC_Member (UserID, Passwd, Name, Regist_No, Telephone)
VALUES ('srlee','1234','이소라','821001-2******','010-1234-1234');
INSERT INTO EC_Member (UserID, Passwd, Name, Regist_No, Telephone)
VALUES ('20park','1234','박연수','810604-1******','010-2345-2345');
더보기
ALTER TABLE EC_MEMBER
ADD(CONSTRAINT Member_CK CHECK(UserID BETWEEN 'a' AND 'z'));
INSERT INTO EC_Member(UserId,Passwd,Name,Regist_No,Telephone)
VALUES('srlee','1234','이소라','821001-2******','010-1234-1234');
INSERT INTO EC_Member(UserId,Passwd,Name,Regist_No,Telephone)
VALUES('20park','1234','박연수','810604-1******','010-2345-2345');

8. Board 테이블의 동일게시물번호(B_Step) 칼럼명을 "B_Level"로 변경하시오

더보기
ALTER TABLE Board
RENAME COLUMN B_Step TO B_Level;

9. 주문처리(EC_Order) 테이블의 기본 키를 삭제하시오

더보기
ALTER TABLE EC_Order DROP PRIMARY KEY;

10. Board 테이블의 B_Email 칼럼에 유일성(unique) 제약조건을 추가하시오.

더보기
ALTER TABLE Board
MODIFY(B_Email VARCHAR2(20) CONSTRAINT BOARD_uk UNIQUE);

11. Board 테이블을 Free_Board 테이블명으로 변경하시오.

더보기
RENAME Board TO FREE_Board;

12. 장바구니(EC_Basket) 테이블을 삭제하시오.

더보기
DROP TABLE EC_Basket;

13. 휴지통의 임시 테이블들을 삭제하시오.

더보기
PURGE RECYCLEBIN;
728x90
LIST
728x90
SMALL

XAMPP MYSQL과 기존 설치했던 MYSQL이 충돌이 나서 접속이 안되는 문제가 발생했다..

 

이럴 경우 포트를 죽이거나 아니면 포트번호를 변경해야한다

 

아래 소개하는 방법은 MYSQL 프로그램을 많이 사용하지 않고 가끔 사용할 때

포트번호 3306을 동시에 같이 사용할 때 사용하는 방법이다

 

1. MySQL Installer에 접속 후 Reconfigure를 클릭한다

 

 

2. 임시로 포트번호를 3306에서 비어있는 포트번호로 바꾼다 ex) 3307

 

3. Mysql을 설치할 때 지정했던 비밀번호를 입력 후 Check 클릭 후 Next 클릭한다

 

4. Next를 클릭한다

5. Execute 클릭한다

6. Finish를 클릭한다

 

XAMPP mysql을 사용할 때는 기존 mysql 포트번호를 3307로 변경해놨다가 MYSQL을 사용할 일이 생기면 다시 같은 방법으로 3306으로 바꾸면 된다

 

이렇게 하면 포트 3306 하나로 2개의 mysql을 사용할 수 있다

728x90
LIST
728x90
SMALL

*Visual Studio 2022를 사용하였습니다.

 

1. 아래 링크 접속

MySQL :: MySQL Downloads

 

2. MySQL Community(GPL) Downloads 클릭

 

3. MySQL Installer for Windows 클릭

 

4. Archives 클릭

 

5.     5.7.41버전 선택 후 용량이 더 큰 아래 파일 Download 클릭

mysql을 c언어와 연동하는 경우에 최신버전은 연동이 안되는 경우가 있어 5.7버전을 선택한다

 

6. 다운로드 받은 폴더에 가서 아래 파일 실행

 

7. Developer Default 클릭, Next 클릭

 

8. next 클릭

 

 

9. Execute 클릭

 

10. next 클릭

 

11. 포트번호 선택 후 Next 클릭

Maria DB나 xampp 내장 Mysql이나 3306을 쓰고 있으면 다른 번호로 변경

 

 

12. 비번입력후  Next 클릭

비번 까먹으면 안되므로 쉬운 비번 선택

.

13. Next 클릭

 

14. Next 클릭

 

15. Execute 클릭

 

16. Finish 클릭

 

17. Next 클릭

 

18. Finish 클릭

 

 

19. Next 클릭

 

20. 아까 적었던 비번 입력 후 Check 클릭 후 Next 클릭

 

21. Execute 클릭

22. Finish 클릭

 

23. Next 클릭

 

24. Finish 클릭

 

25. 지금 이렇게 설치해놓으면 mysql.exe파일이 포함돼어있는 C:\Program Files\MySQL\MySQL Server 5.7\bin 위치에서만 Mysql이 접속되는데 모든 위치에서 mysql을 접속하기 위해 환경변수를 설정해준다

 

26. 톱니바퀴 모양 클릭

 

27. 시스템 클릭

 

28.  왼쪽 메뉴 수크롤 내려서 정보 클릭

 

29. 오른쪽 화면 스크롤 내려서 고급 시스템 설정 클릭

 

 

30. 환경변수 클릭

 

 

31.시스템 변수 Path 클릭하고 편집 클릭 

 

32. 새로만들기 클릭 후 mysql.exe가 들어있는 파일 경로 위치 복붙해서 추가

 

33.  mysql -V 명령어로 설치 잘됐는지 확인

 

34. mysql 명령어를 이용해 접속 시도

mysql -u root -p

한 후

Enter password에서 설치할때 만든 password 입력

 

35. password 입력후 접속 성공

이제 여러 mysql명령어를 이용해 DB 만들기 가능

728x90
LIST
728x90
SMALL

깊은 복사와 얕은 복사를 알아보기 전에 우선 객체 배열에 대해 알아본다

 

목차

1. 객체 배열

2. 깊은 복사와 얕은 복사


1. 객체 배열

int[] num=new int[10] 하듯이 객체도 배열을 만들 수 있다.

책 객체 배열을 만들어보자.

Book[] library =new Book[5]이런식으로 만들 수 있다

그렇다면 이렇게 공간을 만들면 Book 인스턴스 5개가 만들어진걸까?

 

아니다. 

 

아래 예제를 보자.

출력결과가 어떻게 될까

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}

}

public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[5];
	
		
		for(int i=0;i<library.length;i++) {
			
			System.out.println(library[i]);
		}
		
	}

}

아래와 같이 null이 출력되는데 이는 인스턴스가 생성된 것이 아니라 인스턴스 주소가 담길 공간이 5개 생성된 것이다.

 

 

아래와 같이 따로 인스턴스를 또 만들어줘야한다

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}
	public Book(String bookTitle,String author) {
		this.bookTitle=bookTitle;
		this.author=author;
	}
}


public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[5];
		library[0]=new Book("책제목0","홍길일");
		library[1]=new Book("책제목1","홍길이");
		library[2]=new Book("책제목2","홍길삼");
		library[3]=new Book("책제목3","홍길사");
		library[4]=new Book("책제목4","홍길오");
		
	}

}

 

 

자 이제 본론으로 간다.

 


2. 깊은 복사와 얕은 복사

일단 한 줄 요약하면 

얕은 복사는 인스턴스의 주소가 복사되는 것이고

깊은 복사는 인스턴스의 값이 복사되는 것이다

 

1) 얕은 복사(shallow copy)

아래와 같이 arraycopy메서드를 이용해서 library 배열에 있는 객체 배열을 library1 배열에 복사를 했다.

그런데 아까 객체 배열은 인스턴스 값을 따로 또 생성해줘야하는데 아래 예제에는 인스턴스 값을 따로 생성해주지 않았는데 library1 배열에 똑같이 값이 복사되었다.

어떻게 가능한 것일까?

 

이 경우는 바로 객체의 값이 아니라 주소 값이 복사되었기 때문이다.

주소가 동일하므로 값이 똑같이 출력되는 것이다.

 

그러면 배열을 복사해서 다른 배열로 사용하고 싶으면 어떻게 해야할까?

바로 깊은 복사를 사용하면 된다

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}
	public Book(String bookTitle,String author) {
		this.bookTitle=bookTitle;
		this.author=author;
	}
	
	public void showInfo() {
		System.out.println(bookTitle+", "+author);
	}
}

public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[5];
		Book[] library1=new Book[5];
		library[0]=new Book("책제목0","홍길일");
		library[1]=new Book("책제목1","홍길이");
		library[2]=new Book("책제목2","홍길삼");
		library[3]=new Book("책제목3","홍길사");
		library[4]=new Book("책제목4","홍길오");
		
		System.arraycopy(library, 0, library1, 0, 5);
			
		for(int i=0;i<library.length;i++) {
			
			library1[i].showInfo();
		}
		
	}

}

 

출력결과

 

2) 깊은 복사

반복문을 사용하든 System.arraycopy()메서드를 사용하든 객체 배열을 복사하면 항상 인스턴스 주소가 복사되므로 따로 관리 하고 싶다면 깊은 복사를 사용해야한다

 

아래 예문을 보자

package array;
class Book{
	private String bookTitle;
	private String author;
	
	public Book() {}
	public Book(String bookTitle,String author) {
		this.bookTitle=bookTitle;
		this.author=author;
	}
	
	
	
	public String getBookTitle() {
		return bookTitle;
	}
	public void setBookTitle(String bookTitle) {
		this.bookTitle = bookTitle;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public void showInfo() {
		System.out.println(bookTitle+", "+author);
	}
}

public class BookArray {
	public static void main(String[] args) {
		Book[] library=new Book[2];
		Book[] library1=new Book[2];
		library[0]=new Book("책제목0","홍길일");
		library[1]=new Book("책제목1","홍길이");
		
		library1[0]=new Book();
		library1[1]=new Book();
		
		
		for(int i=0;i<library.length;i++) {
			library1[i].setBookTitle(library[i].getBookTitle());
			library1[i].setAuthor(library[i].getAuthor());
		}
		library[0].setBookTitle("책제목3");
		
		for(int i=0;i<library.length;i++) {
			library[i].showInfo();
		}
		
          System.out.println("---------");
          
		for(int i=0;i<library.length;i++) {
			library1[i].showInfo();
		}
		
	}

}

아래와 같이 결과값이 분리되는 것을 볼 수 있다

 

 

출처 : Do it! 자바 프로그래밍 입문-박은종

728x90
LIST
728x90
SMALL

아래의 첫번째 예시를 보자.

public 접근 제어자를 사용해서 언제든지 멤버 변수의 값이 바뀌도록 했다.

package hiding;

public class Student {
	public int studentID;
	public String studentName;
	public int grade;
	public String address;

}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student student = new Student();
		student.studentName="홍길동";
		System.out.println(student.studentName);

	}

}

 

 

그리고 두번째 예시를 보자.

getter, setter 함수를 이용해 private 멤버변수를 접근하도록 했다.

package hiding;

public class Student {
	public int studentID;
	private String studentName;
	public int grade;
	public String address;
	
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student student = new Student();
		//student.studentName="홍길동";
		student.setStudentName("홍길동");
		System.out.println(student.getStudentName());

	}

}

 

 

접근 제어자를 private으로 선언하면 외부 클래스에서 사용할 수 없다.

그리고 위 1, 2예시 모두 결국엔 변수를 사용할 수 있다.

그렇다면 굳이 왜 접근제어자를 private으로 써서 귀찮게 메서드를 만들어 사용하는게 바람직한걸까?

 

 

다음 예제를 보면서 알아보자.

학생수가 32명있어서 학번을 1부터 32번까지 할당하는데 누군가의 실수로 학번이 33번이라고 입력된다고 해보자.

메서드에 조건문을 달아주면 오류가 나더라도 그 값이 해당 변수에 대입되지 않아 정보의 오류를 막을 수 있다

package hiding;

public class Student {
	private int studentID;
	public String studentName;
	public int grade;
	public String address;
	
	
	public int getStudentID() {
		return studentID;
	}
	public void setStudentID(int studentID) {
		if(studentID >32) {
			System.out.println("오류, 다시 입력하시오");
		}else {
		this.studentID = studentID;
	}
 }

}
package hiding;

public class StudentTest {

	public static void main(String[] args) {
		Student student = new Student();
		
		student.setStudentID(33);
		

	}

}

 

이치럼 클래스 내부에 사용할 변수나 메서드는 private으로 선언해서 외부에서 접근하지 못하도록 하는 것을 정보 은닉이라고 한다

 

 

출처 : Do it! 자바 프로그래밍 입문 - 박은종

728x90
LIST
728x90
SMALL

[정보처리기사/예상문제] - 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. this 예약어

2. static 변수

3. 배열

4. 상속, super 예약어

5. 오버라이딩(overrriding)

6. 추상클래스


1. this 예약어

앞에서도 맛보기로 살짝 봤듯이 this는 자기자신을 가리키는 예약어이다.

 

science.getTitle("안녕")이렇게 메서드를 호출하면 

public void getTitle(String title){}메서드가 호출되는데

this. title= title은 즉 science.getTitle="안녕"과 동일하고

science.getTitle이라는 자기자신을 this라고 표현하는 것이다

 

english.getTitle("안녕안녕")도 마찬가지로 

this.title=title은 english.getTitle="안녕안녕"을 뜻한다

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        science.getTitle("안녕");
        System.out.println(science.getTitle());
        
        Book english = new Book();
        english.getTitle("안녕안녕");
        System.out.println(english.getTitle());
    }
}

 

 

1-1) 생성자에서 다른 생성자를 호출하는 this

아래와 같이 클래스에 생성자가 여러 개 있을 때 this라는 예약어를 통해 이 클래스의 다른 생성자를 호출할 수 있다

 

Book()생성자에서 this("1번째 책")을 사용해 Book(String title) 생성자를 호출한 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public Book(){
	  this("1번째책");
  }
  public Book(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        System.out.println(science.title);
    }
}

 

1-2) 자신의 주소를 반환하는 this도 있는데 이 부분은 생략한다


2. static 변수

static 변수는 C언어에서 봤던 개념과 거의 똑같다.

프로그램이 실행되어 메모리에 올라갔을 때 딱 한번만 메모리 공간이 할당되며 그 값은 모든 인스턴스가 공유한다

 

아래 예문의 결과값을 예상해보자.

package test;

class Book {
  public int a=2;
  static public int b=3;
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
       
        english.a++;
        System.out.println(science.a);
        english.b++;
        System.out.println(science.b);
        science.a++;
        System.out.println(english.a);
        science.b++;
        System.out.println(english.b);
        
    }
}
더보기

2

4

3

5

 

static이 아닌 a는 인스턴스마다 새로 초기화가 된다

static인 b는 맨처음 한번 3으로 초기화되고 이 3을 인스턴스끼리 공유한다

 

english.a++; 

System.out.println(science.a); //science.a의 값은 변동이 없어 2가 된다

english.b++; 

System.out.println(science.b); //b가 static변수이므로 1증가된 4가 된다

science.a++;

System.out.println(english.a); //1번증가됐으므로 1증가된 3이 된다

science.b++;

System.out.println(english.b); //b가 static 변수이므로 4에서 1증가된 5가 된다


3. 배열

배열 역시 C언어에서 봤던 개념과 동일하다

클래스가 여러가지 다른 자료형을 설계하는 도구였다면 배열은 여러가지 같은 자료형을 설계하는 도구이다

배열은 같은 자료형을 여러개 한꺼번에 관리할 수 있다

 

배열은 아래와 같은 형태이다

int[] a=new int[10]
int a[]=new int[10]

2가지 형태가 다 가능하다

 

배열 선언과 동시에 초기화

배열은 선언하면 그와 동시에 각 요소의 값이 초기화 되며 아래와 같이 배열 선언과 동시에 특정 값으로 초기화도 가능하다

int[] a=new int[] {1,2,3};
int[] a={1,2,3};

 

자바의 배열은 배열 길이를 나타내는 length 속성을 가지며 a.length하면 3이 출력된다

package test;


public class Test {
    public static void main(String[] args) {

        int[] a= {1,2,3};
        System.out.println(a.length);
        
    }
}

 

배열의 기본적인 것들은 C언어와 동일하므로 생략한다

C언어에서의 배열 개념만 알면 자바에서 배열은 사실 문제만 풀어보면 된다


4. 상속

상속이라는 말은 익힐 들어봤을 것이다.

부모님의 재산을 물려받는 것을 보통 상속이라고 하는데 거의 똑같이 생각해주면 된다.

B 클래스가 A클래스를 상속받으면 B클래스는 A클래스의 객체 변수와 메서드를 사용할 수 있다

 

기본형태는 아래와 같다. Cat이라는 클래스가 Animal이라는 클래스를 상속받았고

그 표현으로 extends라는 표현을 쓴다. 

package test;

class Animal {
	
}

public class Cat extends Animal{
	
}

 

쓸 수 있는 영역을 extends 확장한다는 것이다

상속을 하는 이유를 생각해보자.

고양이 클래스가 있고 개 클래스가 있고 하마 클래스가 있고 이런식으로 여러개의 동물 클래스가 있다고 치자.

고양이, 개, 하마를 묶어서 한꺼번에 동물이라고 표현할 수 있다

고양이, 개, 하마는 모두 동물이므로 만약 따로 따로 클래스를 만들게되면 공통된 요소들이 많아지게 될 것이다

예를 들면 eat(), sleep() 뭐 이런 것들

따로따로 만들면 기능은 똑같은데 굳이 새로 만들어줘야하므로 효율적이지 않다

그래서 상속이라는 개념을 쓴다

 

또한 자바에서 모든 클래스는 Object 클래스의 자식이자 하위 클래스이다.(Object가 제일 상위 클래스)

extends(상속)을 하면 아래의 그림과 같이 확장된다

 

아래와 같은 예문을 보자. Cat cat1=new  Cat()으로 객체를 생성하며 Cat() 생성자를 호출한다. 

출력결과는 무엇일까

package test;

class Animal {
	public Animal(){
		System.out.println("내가 니 부모다");
	}
}

public class Cat extends Animal{
	public Cat(){
	System.out.println("부모님 안녕하세요");
	}
	
	 public static void main(String[] args) {
	  Cat cat1=new Cat(); //cat1 객체 생성
	 }
}
더보기

내가 니 부모다

부모님 안녕하세요

자식 객체를 만들었는데 부모 클래스의 생성자까지 같이 호출되는 것을 확인할 수 있다

즉, 하위 클래스에서 객체가 만들어질 때는 그 객체가 만들어지기 전에 부모가 먼저 만들어지고 그 다음 자식이 만들어진다는 것이다. (생각해보면 부모가 있어야 자식이 있는 것이 당연하다)

상위 클래스의 생성자가 호출된 후 상위 클래스의 객체 변수가 메모리에 생성된다

그 후 하위 클래스의 생성자가 호출된다

 

1) Cat cat1= new Cat(); 실행

2) Object 생성자 호출

3) Animal 생성자 호출

4) Cat 생성자 호출

 

이게 가능한 이유는 원래 super()라는 예약어가 있는데 그게 생략돼있는 것이다.

super()라는 것을 생략해도 컴파일러가 자동으로 넣어준다

super 예약어는 하위 클래스에서 상위 클래스로 접근할 때 사용하며 상위 클래스의 생성자를 호출하는데도 사용한다

 

만약에 매개변수가 있는 상위 클래스의 생성자를 호출해야한다면 super(매개변수); 이런 형태를 쓰면 된다


5. 오버라이딩(overrriding)

 

아래의 출력결과를 예상해보자.

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Cat cat1=new Cat();
	  cat1.eat();
	 }
}

 

더보기

고양이가 밥을 먹다

 

객체를 생성한 후 객체의 메서드를 호출했다. 그런데 아까 배웠듯이 객체가 생성될때 부모의 생성자가 먼저 호출되며 부모가 먼저 만들어진다고 했는데 어떻게 "고양이가 밥을 먹다"가 출력 된 걸까?

이처럼 상위클래스에서 eat()메서드가 이미 정의돼있다.

그런데 상위 클래스에서 정의한 메서드가 하위 클래스에 구현할 내용과 차이가 있을 때는 하위 클래스에서 메서드를 재정의할 수 있는데 이를 메서드 오버라이딩이라고 한다

부모 메서드와 자식 메서드가 동일한 형태로 공존하지만 부모 메서드는 무시되고 자식 메서드만 실행되는 것이다

 

오버라이딩을 하려면 반환형, 메서드 이름, 매개 변수 개수, 매개변수 자료형이 다 같아야 한다

 

 

그렇다면 아래의 출력결과도 예상해보자.

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	 }
}
더보기

고양이가 밥을 먹다

 

이번에는 특이하게 객체를 생성하는데 객체를 생성하는 자료형과 생성자가 다르다

Animal cat1= new Cat();

 

객체를 생성하는 자료형은 부모 클래스인 Animal이고 생성자는 자식의 생성자이다.

부모 클래스의 객체를 생성하는 것인데 이렇게 아래 그림처럼 Animal 자료형인 cat1이 Animal만 접근하는 줄 알았는데

부모 클래스는 항상 자식 클래스에서 자신의 메서드를 재정의했는지 확인하기 때문에 Animal 객체를 생성했지만 Animal의 eat()메서드가 아니라 자식의 eat()메서드가 실행된다


 

6. 추상클래스(Abstract class)

 

아래의 예문을 보자.

오버라이딩이 되면서 "동물이 밥을 먹다"는 절대로 실행될 일이 없다

그렇다면 굳이 적을 필요가 있을까?

package test;

class Animal {
	
	public void eat() {
		System.out.println("동물이 밥을 먹다");
	}
}

public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	 }
}

이런 생각에서 나온 것이 바로 추상 메서드이다.

 

메서드에서 반환타입 메서드 이름등 이런 부분을 선언부라고 하고 안에 중괄호{} 부분을 구현부라고 하는데

아래와 같이 추상메서드는 선언부(메서드 원형)만 존재한다. 

출처  : [Java의 정석]Chapter6.객체지향 프로그래밍(14~17) (velog.io)

 

 

추상메서드는 구현부가 없으므로 반드시 오버라이딩이 된다. 

그리고 구현메서드도 있는데 예를 들어 Animal 클래스를 상속받은 클래스가 고양이, 개 ,하마 정도가 있다고 하면 고양이, 개, 하마는 모두 공통적으로 잠을 자므로 굳이 재정의를 하지 않고 부모 클래스의 sleep()을 그대로 쓴다.

 

이렇게 추상클래스는 추상메서드와 구현메서드가 있고 서로 기능이 비슷한 클래스를 말한다

 

이에 대비되는 개념으로는 서로 기능이 다른 클래스를 인터페이스라고 한다

인터페이스는 구현메서드가 없고 100% 추상메서드로만 구성되어있다 

package test;

abstract class Animal {
	
	public abstract void eat();  //추상메서드
	
	public void sleep() {  //구현메서드
		System.out.println("밤에는 잔다");  
	}
}



public class Cat extends Animal{
	
	public void eat() {
		System.out.println("고양이가 밥을 먹다");
	}
	
	 public static void main(String[] args) {
	  Animal cat1=new Cat();
	  cat1.eat();
	  cat1.sleep();
	 }
}

 

자바는 어렵게 출제가 되지 않으므로 이정도로 마무리하도록 하겠다.

이정도 공부했으면 기출문제를 풀고 개념을 다시 확인해보면 될 것이다


[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

 

728x90
LIST
728x90
SMALL

[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. 객체 생성

2. 객체 생성시 메모리 구조(heap 영역)

3. 생성자

4. 접근제어자


*이 게시글에서는 속성=필드=객체변수=인스턴스 변수=멤버변수라고 불리는 것을 객체 변수라고 통일하겠다.

 

1. 객체 생성

앞선 2탄에서 클래스, 객체, 메서드, 메모리 구조에 대해 살펴 보았다. 

클래스는 책을 예를 들어 책이라는 자료형을 만들기 위해 구성요소(제목, 가격, 출판사, 저자등)를 하나로 합쳐놓은 것이다. 

책이라는 객체의 구성요소를 사용하기 위해 책이라는 자료형을 클래스로 만들었다면 그 구성요소를 이용해서 다양한 책(객체)을 만들어야 하지 않겠는가

자바에서는 Book science = new Book(); 이런 형태로 객체를 만들 수 있다.

이렇게 클래스를 이용해서 만든 객체 여기서는 science를 인스턴스라고 한다.

 

클래스는 붕어빵 틀, 객체는 붕어빵1,2 ... 이라고 생각하면 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
    }
}

science앞에 붙은 Book은 int, String처럼 Book이라는 자료형이라는 표시이므로

Book자료형 science를 선언한다는 의미이다.

Book science는 int a와 동일한 형태이다

뒤에 붙은 new Book()에서 new는 새로만들어진다는 예약어이고 뒤에 나오는 Book()은 생성자(Constructor)라고 불리는 녀석이다. 

Book science = new Book()은 즉 science라는 책 객체를 만든다는 의미인 것이다.

생성자얘기는 나중에 하고 우선 객체를 생성할 때 메모리에 어떻게 동작되는지 알아보자.


2. 객체 생성시 메모리 구조(heap영역)

살짝 복습하면 static이라고 붙은 메서드를 로딩하는데 거기서 제일 먼저 로딩되는 것이 main메서드이다. 위의 코드를 예를 들어 Test class의 main메서드가 제일 먼저 메모리에 로드돼서 호출된다.

호출되면 stack 영역에 들어가는데 이 메인메서드 안에는 Book science라는 변수가 선언돼있다. 

이때 science라는 변수를 참조변수라고 한다.(참조변수이긴 하지만 동시에 지역변수이기도 하다)

참조변수는 주소값을 저장한다.

C언어의 포인터 생각하면 된다.

출처 : [Java] 참조 타입과 참조 변수 :: 불곰 (tistory.com)

 

 

Book science를 선언하고 new 예약어와 함께 Book()이라는 생성자를 호출하면 Heap영역이라는 메모리 공간에 science라는 객체가 하나 생성된다. 

science라는 참조변수는 Heap 영역에 있는 science객체의 주소를 가리킨다.

 

science 객체 안에는 이런식으로 객체가 만들어져있고 science라는 참조변수는 Book객체(science)의 주소를 가리킨다.

여기서 getTitle()이라는 메서드는 실제 위치는 method 영역에 들어있지만 getName() 메서드의 주소로 메서드 영역의 getTitle()과 연결돼있다.

최종적으로 정리하면 Book science = new Book()이라고 하면 heap영역에 science객체(인스턴스)가 생성되고 science라는 참조변수는 heap영역의 science 객체(인스턴스)의 주소를 가리킨다

 

이렇게 객체를 생성하고 나면 그 객체의 이름인 참조변수를 이용해 객체 변수와 메서드를 사용할 수 있다

 

위의 예문 처럼 science.title 이렇게 도트 연산자를 이용해  각 객체의 객체변수와 메서드에 접근할 수 있게 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
        science.title="개미와배짱이";
        System.out.println(science.title);  //개미와배짱이 출력
        System.out.println(science.getTitle()); //개미와배짱이 출력
    }
}

 

앞에서 봤던 아래 예문도 객체를 이용하면 hello메서드를 static 예약어 없이 호출가능하다

 

*static 포함한 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		System.out.println(hello(a));
		System.out.println(a);
	

	}
	public static int hello(int a) {
		a=7;
		return a;
	}
}

 

*static을 사용하지 않은 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		Test test1 = new Test();
		System.out.println(test1.hello(a));
		System.out.println(a);
	

	}
	public int hello(int a) {
		a=7;
		return a;
	}
}

3. 생성자(Constructor)

Book science = new Book();에서

new 예약어 뒤에 붙은 Book()을 생성자라고 한다

 

생성자가 하는 일은 객체(인스턴스)를 heap영역에 생성하고 클래스 안에 Book() 생성자의 {}중괄호를 호출하는 역할을 하는데 객체가 생성될 때 객체 변수 값들을 초기화하는 역할도 한다

즉, science의 title과 english의 title은 다르게 설정된다는 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

 

생성자는 객체를 생성할 때만 호출되는데 생성자 이름은 클래스 이름과 같고 반환값이 없다

생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어주는데 이렇게 자동으로 생성되는 생성자를 기본 생성자(default constructor)이라고 한다

 

개발자가 매개변수가 있는 생성자를 따로 만들면 자동으로 기본 생성자가 생성이 되지 않아 기본생성자를 만들어줘야 한다

아래에 public Book(String title){}이 바로 매개변수가 있는 생성자이다

 

이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로딩이라고 한다

 

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있는데 이를 오버로딩이라고 한다

 

아래에 나오는 this라는 예약어는 객체 자신을 가리키는 예약어인데 우선 이런게 있다고 알고 넘어가자.

 

아무튼 자바의 한 클래스내에 생성자가 두 개 이상이 있으면 인스턴스를 생성할 때 원하는 생성자를 골라서 만들 수 있다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자
  public Book(String title) {
  this.title=title;
  } 

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

4. 접근제어자(access modifier)

자바에서는 예약어를 사용해서 클래스 내부의 변수, 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.

이런 예약어를 접근 제어자라고 한다

접근제어자에는 private, protected, default, public 이렇게 4종류가 있다

 

다른 건 그냥 넘어가고 private만 살펴보자

출처  : 19편. 제어자(Modifiers) (hexabrain.net)

 

 

위 코드의 객체 변수 String title에 접근 제어자를 private으로 바꾸면 동일한 클래스를 제외하고는 이 변수에 직접적으로 접근할 수 없다

그래서 이를 접근하기 위해서는 메서드를 만들면 된다.

 

직접적으로 접근을 할 수 없으니 Book 제목을 받아오거나 지정할 수 있도록 메서드를 사용한다. 

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        //science.title="바보"; //오류발생 //접근 불가
        science.getTitle("안녕");
        System.out.println(science.getTitle());
    }
}

 

정보처리기사 실기에서는 어차피 거의 대부분이 동일한 클래스로 나오므로 사실 잘 몰라도 상관없다

위의 코드는 getTitle이라는 메서드가 오버로딩돼있는 것인데

getTitle을 호출할 때 매개변수가 없으면 public String getTitle()을 호출하는 것이고

매개변수가 있으면 public void getTitle(String title)을 호출하는 것이다

 


[정보처리기사/예상문제] - 2024 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

728x90
LIST

+ Recent posts