작성 : 2024. 4. 17. 1

지금은 HTML을 배우고 있지만 자바스크립트에 대해 미리 조금씩 알아 놓으면 좋을 것 같다.

전에 과외할때 조금 배웠지만 지금은 완전히 까먹었기 때문에 다시 하는 걸로,,

 

✔️자바스크립트란?

-웹페이지에 생동감을 불어넣기 위해 만들어진 프로그래밍 언어

  • 자바스크립트는 브라우저에서만 쓸 목적으로 고안된 언어이지만, 지금은 다양한 환경에서 쓰이고 있습니다.
  • 오늘날 자바스크립트는 브라우저 환경에서 가장 널리 사용되는 언어로 자리매김하였습니다. HTML/CSS와 완전한 통합이 가능합니다.
  • 자바스크립트로 '트랜스파일’할 수 있는 언어는 많습니다. 각 언어마다 고유한 기능을 제공하죠. 자바스크립트에 숙달한 뒤에 이 언어들을 살펴볼 것을 추천드립니다.

 

✔️자바스크립트의 강점

  • HTML/CSS와 완전히 통합할 수 있음
  • 간단한 일은 간단하게 처리할 수 있게 해줌
  • 모든 주요 브라우저에서 지원하고, 기본 언어로 사용됨

 

출저) 

 

자바스크립트란?

 

ko.javascript.info

 

 

  • 어제 배웠던 form 태그에서 추가로 더 배운 것들
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <!-- 0416~0417 -->
        <!-- 폼태그의 역할 : 사용자로 부터 입력받는다 1.직접 문자를 입력받는 방식 (문자) 2.선택을 통해 입력받는 방식 -->

        <form action="http://www.naver.com">
            <fieldset>
                <legend>히든 폼</legend>
                <input type="hidden" name="name" value="홍길동">
                <!-- 화면에서는 폼이 보이지 않음 -->
            </fieldset>
            <fieldset>
                <!-- 경계를 만들어주는 <fieldset> -->
                <legend>직접 입력하는 폼</legend>
                <!-- 제목을 달 수도 있다 -->
            </fieldset>
            <fieldset>
                <p>
                    <label>(필수) 아이디 :</label>
                    <input
                        type="text"
                        name="id"
                        size="40"
                        value="king"
                        autofocus="autofocus"
                        required="required"
                        readonly="readonly"/>
                    <!-- value 는 기본값 속성, 하지만 입력받는 값이나 데이터 속성에 따라 바뀔 수 있음 -->
                    <!-- autofocus 자동 커서 켜기 -->
                    <!-- required 입력되지 않으면 메세지 띄우기 -->
                    <!-- readonly 는 비활성화, 수정 불가능 -->
                </p>
                <p>
                    <label>비밀번호 :</label>
                    <input type="password" name="pwd" maxlength="12"/>
                    <!-- 패스워드 타입은 인풋칸에 입력하면 암호처리가 됨 숫자가 보여지지 않음 -->
                    <!-- maxlength 비밀번호 길이 제한 -> 레귤러 속성을 더 많이 씀 -->
                </p>
                <p>
                    <label>이메일 :</label>
                    <input type="email" name="email"/>
                    <!-- 이메일 타입은 인풋에 값을 받을 떄 골뱅이가 꼭 들어가야 함. -->
                </p>
                <p>
                    <label>연락처 :</label>
                    <input type="tel" name="tel"/>
                    <!-- 연락처를 받는 타입, 연락처의 숫자 서식을 구분 -->
                </p>
                <p>
                    <label>가입인사 :</label>
                    <textarea name="content" rows="7" cols="39" placeholder="가입인사를 적으세요"></textarea>
                    <!-- textarea 는 여러 줄을 입력받을 수 있다 ex_게시판글 -->
                    <!-- placeholder는 데이터로 처리되지 않음, 도움말로 사용 -->
                </p>
                <p>
                    <label>파일 첨부 :</label>
                    <input type="file" multiple="multiple">
                    <!-- 파일을 입력받을 수 있다 -->
                    <!-- multiple을 넣으면 여러 개의 파일을 입력 받을 수 있다 -->
                </p>
            </fieldset>
            <fieldset>
                <legend>선택형 입력형</legend>
                <!-- 입력형은 입력받은 값이 value 값으로 들어가지만 선택형은 그렇지 않기 떄문에 반드시 value 값을 지정해서 표기해야 함! -->
                <!-- value 값이 실질적인 데이터가 됨 -->
                <p>
                    <label>성 별 :</label>
                    <input type="radio" name="gender" value="male">남자
                    <input type="radio" name="gender" value="fmale">여자
                    <!-- radio 는 선택지 중 하나를 선택할 수 있도록 해준다 name을 같게 해서 선택지를 묶어야 한다! -->
                </p>
                <p>
                    <label>선물포장 :</label>
                    <input type="radio" name="gift" value="yes">선물포장
                    <input type="radio" name="gift" value="no" checked="checked">선택 안함
                    <!-- checked 선택 기본값 지정 -->
                </p>
                <p>
                    <label>취미 :</label>
                    <input type="checkbox" name="hoppy" value="sport">운동
                    <input type="checkbox" name="hoppy" value="travel">여행
                    <input type="checkbox" name="hoppy" value="reading" checked="checked">독서
                    <!-- 체크박스는 복수 선택 가능! name이 같을 필요는 없지만 같이 묶어둬야 나중에 데이터 처리가 쉬워진다-->
                </p>
                <p>
                    <label>직업 :</label>
                    <select>
                        <option value="">-- 직업선택 --</option>
                        <option value="jop1">
                            자영업
                        </option>
                        <option value="jop2">
                            공무원
                        </option>
                        <option value="jop3" selected="selected">
                            회사원
                        </option>
                        <!-- selected 는 자바스크립트에서 현재 체크되어진 값을 확인하는 용도 -->
                        <option value="jop4">
                            연예인
                        </option>
                        <option value="jop5">
                            기타
                        </option>
                    </select>
                </p>

                <!-- 날짜를 선택 -->
                <p>
                    <label>날짜 1 :
                    </label>
                    <input type="date">
                    <!-- 년, 월, 일 정보가 보여지고 선택할 수 있게 해줌 -->
                </p>
                <p>
                    <label>날짜 2 :
                    </label>
                    <input type="month">
                </p>
                <p>
                    <label>날짜 3 :</label>
                    <input type="week">
                </p>
                <p>
                    <label>날짜 4 :</label>
                    <input type="time">
                </p>
            </fieldset>
            <input type="submit" value="회원가입">
            <!-- 폼에 입력된 값들을 <form action="__.jsp"> 에 연결된 서버에 입력해준다 (링크기능) 지금은 연결할 서버가 없어서
            네이버로 연결되게 해두었다-->
            <input type="reset" value="취소">
            <!-- 서버에 입력한 값을 리셋해준다 -->

            <button type="submit">회원가입</button>
            <button type="reset">취소</button>
            <!-- button 으로 submit, reset 가능 -->

            <!-- 모든 것을 그냥 입력하는 게 아니라 자바스크립트로 넘어가서 유효성 검증을 해야한다 -->

            <button>소리가 나용</button>
            <input type="button" value="영상 실행">
            <!-- 내가 의미하는 것을 구현하고 싶을 떄 쓰는 태그들 -->
        </form>
    </body>
</html>

 

  • 배운 것만으로 만들어보기

웹표준의 정석 _ 예제문제

css 없이 화면구현을 해보았다. 

 

코드 :

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>연습문제02</title>
    </head>
    <body>
        <form>
            <fieldset>
                <dd>
                    <h1>
                        프론트엔드 개발자 지원서
                    </h1>
                    <p>
                        HTML, CSS, Javascript에 대한 기술적 이해와 경험이 있으신 분을 찾습니다.</p>
                    <hr/>
                    <dl>
                        <dt>
                        <h3>개인정보</h3>
                    </dt>
                        <dd>
                            <label>이름</label>
                            <input type="text" name="name" placeholder="공백없이 입력하세요">
                            <p></p>
                            <label>연락처</label>
                            <input type="tel" name="tel">
                        </dd>
                    </dl>
                    <dl>
                    <h3>지원분야</h3>
                    <dd>
                        <input type="radio" name="field" value="job1">
                        웹 퍼블리싱
                        <p></p>
                        <input type="radio" name="field" value="job2">
                        웹 애플리케이션 개발
                        <p></p>
                        <input type="radio" name="field" value="job3">
                        개발 환경 개선
                    </dd>
                    <p></p>
                    <h3>지원동기</h3>
                    <textarea
                        name="motive"
                        rows="7%"
                        cols="70%"
                        placeholder="본사 지원 동기를 간략히 써 주세요"></textarea>
                    <br>
                    <input type="submit" value="접수하기">
                    <input type="reset" value="다시 쓰기">
                    <p></p>
                </dd>
            </fieldset>
        </form>
    </body>
</html>

 

가장 중요한 건 name 속성과 value 속성 + id 속성 이다.

 

✔️CSS 배우기

단독으로 작성되지만 HTML과 연동되어 사용하는 언어.

✔️HTML에 CSS를 적용하는 방법 3가지

  • 인라인 작성방식
  • 내부에 작성방식
  • 외부에 작성방식

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
     <!-- href에 절대경로, 상대경로를 적어주면 된다
    이것이 3. 외부에 작성 방식 -->
    <link rel="stylesheet" href="./myStyle.css"/>
    
    <!-- 2.내부에 작성 방식 : <style> 시트 만들기 -->
    <style>
        p {
            color: cornflowerblue;
        }
    </style>
    
</head>
<body>

    <!-- css적용방법
    1.인라인 작성 방식
    2.내부에 작성 방식 : <style> 시트 만들기
    3.외부에 작성 방식 : 별도의 파일 작성 (___.css)-->

    <!-- 1. 인라인 작성방식 -->
    <!-- <p style="color: darkolivegreen;">코리아 아카데미 it</p> -->

    <!-- <p>맛있는 거 먹고 쿨쿨</p> -->
    <h1>맛있는 거 먹고 쿨쿨</h1>

</body>
</html>

 

외부에 작성하는 방식으로 했을 땐 아래와 같은 시트가 파일로 하나 만들어져야한다.

h1 {
    color: rgb(148, 210, 117);
}

파일명은 ___.css ← 이런식으로 뒤에 .css를 붙여야한다.

 

css 에서 선택자를 불러오는 방식들

다 주석처리해두고 하나씩 실행해본 코드들이기 때문에 똑같이 복붙해서 쓰면 안된다.

<style>
        선택자 {
            속성 : 값;
            속성 : 값;
            속성 : 값;
        }

        /* 조합을 어떻게 하느냐에 따라 구성이 다양해진다 */

        /* 전채선택자 : 모든 요소를 다 선택할 수 있다 */
        * {
            color: indianred;
        }

        /* 태그 선택자 */
        /* 선택된 태그에는 모두 동일한 효과가 입혀진다 */
        p {
            color: rgb(89, 166, 125);
        }

        /* 클래스 선택자 */
        .accent {
            color:blueviolet
        }

        /* 아이디 선택자 */
        #accent2 {
            color: darkorange;
        }

        .fonts {
            font-size: 30px;
        }

        #fonts2 {
            font-size: 30px;
        }

        /* 그룹선택자 */
        p,h1 {
            color: rgb(19, 191, 191);
        }

    </style>
    </head>
<body>
    <p>내용1</p>
    <h1>내용2</h1>
    <p class="accent fonts">내용3</p>
    <!-- class 속성은 css에서 활용도가 높다 -->
    <p id="accent2">내용4</p>
    <!-- id 속성은 하나는 적용이 되지만 두 개 이상은 적용이 되지 않는다 -->
    <!-- id 속성은 css에서 잘 사용하지 않는다
    id 속성은 스크립트에서 정보 요소를 읽어올 때 사용된다 -->
</body>

 

뭔가 여기저기서 가져다 붙여서 아까 만들었던 연습문제를 꾸며보았다.

접수하기와 다시 쓰기 버튼을 누르면 색도 변한다.

붙여쓰려해도 뭐가 뭔지를 알아야하는구나 + 붙여쓰면 편하다 라는 오늘의 깨달음..

작성 : 2024. 4. 16. 

 

오늘은 Html + css + 자바스크립트에 들어간다.

 

웹 구성 접근할 때 3대 요소

1. 웹 접근성

2. 웹 표준

3. 웹 호환성

 

 

HTML 기본문법

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>네이버</title>  <!--파비콘과 함께 페이지 상단의 제목-->
</head>
<body>
     <!--로 감싸면 주석 처리가 됩니다.-->
     <!-- commend + / 하면 주석처리 -->
    <h1>제목1</h1>
    <h2>제목2</h2>
    <h3>제목3</h3>
    <h4>제목4</h4>
    <h5>제목5</h5>
    <h6>제목6</h6>

    <p> 문단 1 </p> 
    <p> 문단 2 </p>
    <!-- p 태그는 한줄로 나오는 것이 속성 -->

    문단1 <br> 
    문단2 <br /> 
    문단3 <br /> 
    문단4 <br /> 
    <!-- br 태그는 이런 식으로 사용할 수 있습니다. 줄을 바꿔주고 p 태그처럼 행간격이 생기지는 않습니다 -->

    <!--태그를 사용하면 줄이 자동으로 바뀌는 경우 (h 태그들 ) 가 있고 아닌 경우가 있습니다-->
    <!--css 는 디자인 뿐 아니라 코드를 뽑아 올때도 쓰입니다-->

    <strong> 글자 굵게 </strong>
    <b> 글자 굵게 </b>
    <!-- 글자를 굵게 하는 역할은 같다 -->
    <br>
    <em> 글 강조 </em>
    <i> 글 강조 </i>
    <!-- 날리는 글씨 표현 -->

<!-- 목록태그들에 대해 알아봅니다 -->
        <ul>
            <li>JAVA</li>
            <li>HTML</li>
            <li>CSS</li>
            <!-- li 태그가 늘어날 수록 목록이 늘어난다 -->
        </ul>
        <!-- 기호로 목록 구분 -->

        <ol type = 'A' reversed> 
            <li>서울</li>
            <li>김천</li>
            <li>부산</li>
        </ol>

        <ol> 
            <li>제주도</li>
            <li>부안</li>
            <li>강릉</li>
        </ol>
        <!-- 번호, 알파벳으로 목록 구분 -->

        <dl>
            <dt> - Hello</dt>
            <dd>안녕하세요</dd>
        </dl>
        <!-- 한 구성을 이루고 있습니다. -->
        <!-- 뜻을 풀이할 때 사용 -->

        <!-- 라이브 서버열 때 commend + fn + l + o -->

    </body>
</html>

 

  • 테이블 만들기
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <table border='1' width='350' height='350'>
            <!-- 웹 구성 접근할 때 3대 요소 1. 웹접근성 2. 웹표준 3. 웹호환성 -->
            <thead>
                <tr>
                    <th>이름</th>
                    <th>나이</th>
                    <th>주소</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>4</td>
                    <td>5</td>
                    <td>6</td>
                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td>7</td>
                    <td>8</td>
                    <td>9</td>
                </tr>
                </tfoot>
                </table>


                <!-- table의 병합 -->
                html 크기단위 : px(생략시 절대크기), % (브라우저 화면 대비)
                <table border="1" width = "50%" height = "50%"> 
                    <caption>월별 매출현황</caption>
                    <tr>
                        <td>01</td>
                        <td colspan="2">02</td>
                        <!-- colspan 가로 셀 합치기 -->
                        <td rowspan="3">04</td>
                    </tr> 
                    <tr>
                        <td>05</td>
                        <td colspan="2" rowspan="2">06</td>
                    </tr> 
                    <tr>
                        <td>09</td>
                    </tr> 
                </table>
            </tfoot>
        </table>
    </body>
</html>

 

  • 테이블 만들기 연습
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <table border='1' width='80%' height='50%'>
            <thead>
                <tr>
                    <th rowspan="5">학력사항</th>
                    <th>졸업일</th>
                    <th colspan="2">학교명</th>
                    <th >전공</th>
                    <th>졸업여부</th>
                    <th>소재지</th>
                    <th>성적</th>
                </tr>
                <tr>
                    <th>
                        년 월</th>
                    <th align="right" colspan="2">고등학교</th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th>
                        /
                    </th>
                </tr>
                <tr>
                    <th>
                        년 월</th>
                    <th align="right" colspan="2">대 학</th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th>
                        /
                    </th>
                </tr>
                <tr>
                    <th>
                        년 월</th>
                    <th align="right" colspan="2">대학교</th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th>
                        /
                    </th>
                </tr>
                <tr>
                    <th>
                        년 월</th>
                    <th align="right" colspan="2">대학원</th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th>
                        /
                    </th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <th rowspan="4">경력사항</th>
                    <th colspan="2" width="20%">근무기간</th>
                    <th width="20%">회사명</th>
                    <th>직위</th>
                    <th>담당업무</th>
                    <th colspan="2">퇴사사유</th>
                </tr>
                <tr>
                    <th colspan="2">
                        -
                    </th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th colspan="2"></th>
                </tr>
                <tr>
                    <th colspan="2">
                        -
                    </th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th colspan="2"></th>
                </tr>
                <tr>
                    <th colspan="2">
                        -
                    </th>
                    <th></th>
                    <th></th>
                    <th></th>
                    <th colspan="2"></th>
                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <th rowspan="2">병역사항</th>
                    <th>군필여부</th>
                    <th colspan="4">군필 ( ), 미필 ( ), 면제 ( ), 기타 ( )</th>
                    <th>군 별</th>
                    <th></th>
                </tr>
                <tr>
                    <th>복무기간</th>
                    <th colspan="4" align="right">( 년 월)</th>
                    <th>계 급</th>
                    <th></th>
                </tr>
            </tfoot>
        </table>
    </body>
</html>

 

  • 이미지 넣는 방법
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <!-- 이미지 넣어보기 -->
        <!-- 상대경로와 절대경로 방식을 사용 -->
        <img
            src="file:///Users/yunakang/Desktop/code/codeonlap/animal.jpg"
            /
            alt="동물의 숲 고리대금업자">
        <!-- alt = "동물의 숲 고리대금업자" <- 이미지가 깨질 때나 시각장애인을 위해 음성지원을 제공할때 -->
        <!-- 위는 절대경로 -->
        <br>
        <img src="img/animal.jpg" width="50" height="30"/>
        <!-- 위는 상대경로 -->
        <br>
        <img src="./animal.jpg"/>
        <!-- 나와 동일한 위치를 표현 , ./ 를 붙여도 되고 생략도 가능하다-->
        <br>
        <img src="../animal.jpg"/>
        <!-- 상위 위치를 표현할 때 이렇게 씀 -->

        <!-- html 이미지 절대경로 상대경로 좀 잘 알아놓기 -->
    </body>
</html>

 

  • 태그 넣는 방법
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>a태그에 대하여</title>
</head>
<body>
    <!-- <a href="이동할 페이지의 경로(html) or url or 특정파일">회원가입</a> -->
    <a href="http://www.naver.com">네이버</a>
    <br>
    <!-- <a href="절대 경로 아니면 상대경로가 들어간다">로그인</a> -->
    <a href="./index-pixelArt_다시하기.html">픽셀아트의 세계로</a>
    <br>
    <a href="//127.0.0.1:5500/index-pixelArt_%EB%8B%A4%EC%8B%9C%ED%95%98%EA%B8%B0.html" target="_blank">초대합니다</a>
    <!-- target="_blank" 를 쓰면 새로운 페이지가 나옴 -->
    <br>
    <a href="img/animal.jpg">동물의 숲</a>
    <br>
    <a href="http://www.naver.com"><img src="./animal.jpg"/></a>
</body>
</html>

 

  • 미디어 넣는 방법
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <!-- <object></object> 는 미디어를 넣을 때 쓴다 -->
        <object width="900" height="800" data="media/product.pdf"></object>
        <!-- <embed> 태그는 음원이나 동영상을 넣을 때 사용한다 -->
        <br>
        <embed src="media/spring.mp3">
        <br>
        <!-- <audio src=""></audio> 태그는 음원을 넣을 때 사용 -->
        <audio src="media/spring.mp3" controls="controls"></audio>
        <!-- video는 영상을 넣을 때 사용 -->
        <br>
        <video src="media/KakaoTalk_Video_2024-04-16-16-29-08.mp4" controls width= "500"></video>
        <iframe width="801" height="451" src="https://www.youtube.com/embed/hGrIgIfCxP0" title="도서관에서 공부할 때 최대 집중력이 필요하다 | 3 hour lofi hip hop mix / lofi music for studying , work" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

    </body>
</html>

<iframe> 의 경우 유튜브에서 원하는 영상에 마우스 오른쪽 키를 누르면 소스코드 복사 항목이 뜬다!

그 소스코드를 복붙하면 저렇게 HTML화면에서 원하는 영상을 유튜브에서 가지고 올 수 있음!

 

  • form 태그의 사용
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <!-- 폼태그의 역할 : 사용자로 부터 입력받는다 1.직접 문자를 입력받는 방식 (문자) 2.선택을 통해 입력받는 방식 -->

        <form>
            <p>
                <label>아이디 :
                </label>
                <input type="text" name="id"/>
            </p>
            <p>
                <label>비밀번호 :
                </label>
                <input type="password" name="pwd"/>
            </p>
        </form>

    </body>
</html>
  • 이미지 태그의 경로설정, 원하는 모양으로 테이블 만들기를 연습하고 좀 더 알아볼 것!
  • 5월 19일 산업기사 시험, 산업기사 자격요건 졸업증명서 첨부하기

 

  • 배운 것만으로 만들어보기

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>연습문제01</title>
    </head>
    <body>
        <!-- 페이지를 구성하는 가장 큰 제목은 h1 태그를 씀.  -->
        <!-- 페이지를 구성하기 위헤 보통 h3까지 사용 -->
        <h1>수습 국원 모집</h1>
        <h2>방송에 관심있는 새내기 여러분 환영합니다</h2>
        <p>교내 방송국에서 신입생을 대상으로 수습 국원을 모집합니다. 학부나 전공에 상관없습니다. 
            <br>
            평소 방송에 관심있었던 여러 학우들의 지원바랍니다.</p>

        <ul>
            <li>
                <strong>모집 기간 :
                </strong>
                3월 2일 ~ 3월 11일</li>
            <li>
                <strong>모집 분야 :
                </strong>
                아나운서, PD, 엔지니어</li>
            <li>
                <strong>지원 방법 :
                </strong>
                양식 작성 후 이메일 접수</li>
            <i>
                지원서 양식은 교내 방송국 홈페이지 공지 게시판에 있습니다.</i>
        </ul>
        <h3>혜택</h3>
        <ol type="a">
            <li>수습기자 활동 준 소정의 활동비 지급</li>
            <li>정기자로 진급하면 장학금 지급</li>
        </ol>

        <img src="./animal.jpg" width="500"/>

    </html>

작성 : 2024. 4. 15. 

 

문자열을 다루는 법

package etc0411;

public class StringTest0415 {
//0415
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		
		// 문자열을 더하는 방법
		String str = "hello";  // str은 주소값을 받음
		str += "world";  // 기존의 "hello"에 더해지는 게 아니라 아예 새로운 곳에 메모리를 할당함 
		// 메모리 효율성이 떨어짐, 하지만 보통 이렇게 쓰곤 함..
		
		String str2 = new String("hello"); // 정석의 방법
		
		String str1 = "hello";
		String str2 = "world";
		
		
		// 문자열이 같은지 같지 않은지 비교
		if (str1.equals(str2)) {   
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}
		
		// --------------------------------------------------------------------------
		
		// 배열을 선언
		char[] cArr = {'h', 'e', 'l', 'l','o'};
		String str = new String(cArr); // "hello"
		
		System.out.println(str);
		
		// 문자열을 문자로 쪼개기
		String str2 = "hello";  // 문자열은 인덱스 번호로 부여됨
		
		System.out.println(str2.charAt(0)); 
		
		// 문자열 배열 안에 있는 값 꺼내기
		for (int i = 0; i < str2.length(); i++) {
			System.out.println(str2.charAt(i));  
		}
		
		String str3 = "world";
		// 문자의 인덱스 번호 알아보기 (위치값)
		System.out.println(str3.indexOf('r'));
		// 전체 구성에서 시작 인덱스의 값을 받을 수도 있음
		System.out.println(str3.indexOf("ld"));
		
		// 전체 문자에서 .split(",") 기준으로 쪼개기 -> (",") 안에 들어가는 것을 기준으로 값이 쪼개짐
		String str4 = "cat, dog, bear";
		String[] arr = str4.split(",");
		
		// 전체 문자열의 일부분을 사용하고 싶을 때
		String str5 = "java.lang.Object";
		System.out.println(str5.substring(5, 9));   // 시작 인덱스, 마지막 인덱스 + 1 
		
		// valueOf 는 모든 타입을 문자열로 바꿔줌
		int x = 100;
		String is = String.valueOf(x);  // boolean, int , long, float ...
		System.out.println(is);  // 문자열로 바꿔줌
		
		String is2 = x + "";  // String is = String.valueOf(x); 와 같은 뜻
		// 간단하게 위와 같이 많이 씀
		System.out.println(is2);  // 100 이 나옴, 결과는 같음.
		
		// 문자열을 그냥 가지고 와 사용할 수도 있음
		if ("hello".equals("hello")) {
			System.out.println("같다");
		}
		
		
	}

}
// 예제) 문자열 쪼개기 (나누기)
		String fullName = "hello.java";
		int idx = fullName.indexOf('.');
		
		String filelName = fullName.substring(0, idx); // 시작값과 끝값을 가지고 오기
		String ext = fullName.substring(idx + 1);

		System.out.println(filelName);
		System.out.println(ext);

 

  • StringBuffer / StringBuilder 의 차이와 장단점 알아두기
String은 짧은 문자열을 더할 경우 사용합니다.StringBuffer는 스레드에 안전한 프로그램이 필요할 때나, 개발 중인 시스템의 부분이 스레드에 안전한지 모를 경우 사용하면 좋습니다.StringBuilder는 스레드에 안전한지 여부가 전혀 관계 없는 프로그램을 개발할 때 사용하면 좋습니다. 단순히 성능만 놓고 본다면 연산이 많은 경우, StringBuilder > StringBuffer >>> String 입니다.

 

출저)

 

[자바] String, StringBuilder, StringBuffer의 차이

* String, StringBuffer, StringBuilder 차이점과 장단점. Java를 사용하면 종종 접하게 되는 문자열 클래스들입니다. (기술면접시 만나게 되는 문제 중 하나.) String, StringBuffer, StringBuilder.. 모두 문자열을 저

12bme.tistory.com

 

아래 StringBuffer를 쓰는 방법 코드

// 효율성을 높이기 위해 만들어진 클래스
		// StringBuffer / StringBuilder
		// 동기화         / 동기화 안됨
		// 둘 다 생성하는 과정을 거쳐 사용해야 함.
		
//		StringBuffer sd = new StringBuffer("abc");  // 메모리를 새로 할당하지 않음
//		System.out.println(sd);  
//		
//		sd.append("001");
//		System.out.println(sd);
//		
//		System.out.println(sd.length());  // 길이 알기
//		sd.delete(1, 3);  // 지우기
//		System.out.println(sd);
//		System.out.println(sd.length());
		
		
		// 동일 타입, 문자열 값 같음
		StringBuffer sd1 = new StringBuffer("abc");
		StringBuffer sd2 = new StringBuffer("abc");
		
		// StringBuffer 는 equals 가 오버라이딩이 안되어 있어 같다고 나오지 않음
		if (sd1.equals(sd2)) {
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}
		
		
		// String 은 equals 가 오버라이딩되어 있어 같다고 나옴.
		String str1 = sd1.toString();
		String str2 = sd2.toString();
		
		if (str1.equals(str2)) {
			System.out.println("같다");
		} else {
			System.out.println("다르다");
		}
		
		
	}

}

 

 

  • 오토박싱
package etc0411;

public class WrapperTest {
//0415 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Wrapper 클래스
		// 기본형과 참조형 간 형변환을 위한 클래스 
		// 형변환 - 기본형끼리 형변환 가능, 참조형끼리 형변환 가능(상속), 
		// 기본형과 참조형은 형변환이 불가능 , 단 예외로 Wrapper 클래스인 경우에는 가능!
		// 이 경우 형변환이라고 안하고 오토박싱 이라고 함. (박싱, 언박싱)
		// 기본형을 참조형으로 형변환 한다.
		// 기본형이 8개이니, Wrapper 클래스는 총 8개
		// Boolean, Byte, Short,, Character, Integer, Long, Float, Double 값의 범위만 다르고 쓰는 방법은 같음.
		
		int i = 10;
		Integer it = new Integer(20);
		// int i2 = it.intValue();  // 20 이라는 값을 가지고 와 줌.
		int i2 = it;  // 위와 같은 의미 
		
		System.out.println(i2);
		
		Integer it2 = i;  // 원래는 이렇게 써야 하지만 (Integer)i; 자동으로 변환됨 -> 박싱이라고 함.
		
		int x = 100;
		Integer it3 = 200; 
		System.out.println(x + it3);  // 언박싱이 발생함.
		
		int y = new Integer(30); // 오토박싱
		System.out.println(y);
		
		String s = "1000"; // 숫자가 아니면 오류남
		int z = Integer.parseInt(s); // 문자열을 숫자로 바꿔줌
		
		System.out.println(z);
		
		
		// 오브젝트 타입의 언박싱 사용 방법을 알아둘 필요가 있음
		int i = 10; 
		
		Object obj;  // 오브젝트도 오토박싱이 될까? -> 됨
		obj = i;  // new Integer(i); 실제 들어가는 값
		
		int result = (Integer)obj;  // 오브젝트는 캐스팅없이 언박싱 불가
		System.out.println(result);

	}

}

 

자바 수업은 오전까지 하면 끝이 납니다. 오후에는 시험 봅니다.

웹 수업하기 전 자바2 를 할 예정입니다. 뒷부분이 굉장히 중요합니다.

 

내일부터는 Html, css, 자바스크립트 시작.

css, 자바스크립트 시작 → 잘 알아두면 좋아요 프론트 할거면

 

  • 날짜를 다루는 클래스
package etc0411;

import java.util.Calendar;
import java.util.Date;

public class DateTest0415 {

	public static void main(String[] args) {
		// 날짜를 다루는 클래스
		// Date, Calendar 두 가지 클래스가 있음
		// 서로 호환이 가능
		
		
		// Date 사용법
		Date today = new Date(); // import java.util.Date; 추가.
		System.out.println(today); // 내 컴퓨터에 표시된 날짜가 나옴
		
		System.out.println(today.getYear() + 1900);  // 1900년을 기준으로 흘러간 연도를 표시해줌
		System.out.println(today.getMonth() + 1);  // 0 ~ 11 월까지 되어있기 때문에 + 1
		
		
		
		// Calendar 사용법
		Calendar cal = Calendar.getInstance();
		System.out.println(cal);  // 나오는 상수값이 모두 사용할 수 있는 값들
		
		System.out.println(cal.get(Calendar.YEAR));
		System.out.println(cal.get(Calendar.MONTH) + 1);  // 0 ~ 11 월까지 되어있기 때문에 + 1
		System.out.println(cal.get(Calendar.WEEK_OF_YEAR));
		System.out.println(cal.get(Calendar.DATE));
		System.out.println(cal.get(Calendar.DAY_OF_WEEK));  // 1. 일요일 2. 월요일 ... 7. 토요일
		
		System.out.println(cal.get(Calendar.HOUR));
		System.out.println(cal.get(Calendar.HOUR_OF_DAY));  // 24시간 표기법
		System.out.println(cal.get(Calendar.MINUTE));
		System.out.println(cal.get(Calendar.SECOND));		
		System.out.println(cal.getActualMaximum(Calendar.DATE)); // 달의 마지막 날짜를 알 수 있게 해줌
		
		
		// 날짜 계산
		Calendar cal = Calendar.getInstance();
		
		// 내가 원하는 날짜로 세팅 가능
		cal.set(2005, 7, 31);  // 3을 넣었다는 것은 4월을 의미함.
		System.out.println(toString(cal));
		
		cal.add(Calendar.DATE, 1);
		System.out.println(toString(cal));
		
		cal.add(Calendar.MONTH, -6);
		System.out.println(toString(cal));
		
		cal.roll(Calendar.DATE, 31); // 날짜만 더함
		System.out.println(toString(cal));
		
		cal.add(Calendar.DATE, 31); // 전체적인 영향을 줌
		System.out.println(toString(cal));
		
	} // main end
	
	public static String toString(Calendar cal) {
		return cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + (cal.get(Calendar.DATE)) + "일";
	}

}

 

이어진 코드

// 날짜 계산하는 프로그램 
		// time1 과 time2 의 차를 구하기
		
		final int[] TIME_UNIT = {3600, 60, 1};
		final String[] TIME_UNIT_NAME = {"시간 ", "분 ", "초"};
		
		Calendar time1 = Calendar.getInstance();
		Calendar time2 = Calendar.getInstance();
		
		time1.set(Calendar.HOUR_OF_DAY, 10);
		time1.set(Calendar.MINUTE, 20);
		time1.set(Calendar.SECOND, 30);
		
		time2.set(Calendar.HOUR_OF_DAY, 20);
		time2.set(Calendar.MINUTE, 30);
		time2.set(Calendar.SECOND, 10);
		
		long difference = Math.abs(time2.getTimeInMillis() - time1.getTimeInMillis()) / 1000;
		System.out.println("time1과 time2의 차이는 " + difference + "초 입니다."); // time1과 time2의 차이는 36580초 입니다.
		
		// 두 시간의 차이를 담는 곳
		String tmp = "";
		
		for (int i = 0; i < TIME_UNIT.length; i++) {
			tmp += difference / TIME_UNIT[i] +  TIME_UNIT_NAME[i];
			difference %= TIME_UNIT[i];
		}
		
		System.out.println("시분초의 차이 : " + tmp);
		
		
	} // main end
	
	public static String toString(Calendar cal) {
		return cal.get(Calendar.YEAR) + "년 " + (cal.get(Calendar.MONTH) + 1) + "월 " + (cal.get(Calendar.DATE)) + "일";
	}

}

 

 

국비 단위평가를 처음으로 보았다~

난 그냥 결과만 나왔다;; .. 기능 구현은 하나도 못한듯

그에 대한 셀프 고문으로 학원에 거의 10시까지 남아서 이러고 있다..

나 계속 여기 다닐 수 있을까..?

 

 

암튼 문제)

다음은 키보드로부터 계좌 정보를 입력받아서, 계좌를 관리하는 프로그램입니다. 실행 결과를 보고, 알맞게 BankApplication 클래스의 메소드를 작성해보세요.

→ 알고보니 ‘이것이 자바다’ 예제 문제를 그대로 낸 것이었다.

 

내가 푼 반쪽짜리 답 :

public class BankApplication {
	private static Account[] accountArray = new Account[100];
	private static Scanner scanner = new Scanner(System.in);

	public static void main(String[] args) {
		boolean run = true;
		while (run) {
			System.out.println("------------------------------------------");
			System.out.println("1.계좌생성 | 2.계좌목록 | 3.예금 | 4.출금 | 5.종료");
			System.out.println("------------------------------------------");
			System.out.print("선택> ");

			int selectNo = scanner.nextInt();

			if (selectNo == 1) {
				createAccount();
			} else if (selectNo == 2) {
				accountList();
			} else if (selectNo == 3) {
				deposit();
			} else if (selectNo == 4) {
				withdraw();
			} else if (selectNo == 5) {
				break;
			}
		}
		System.out.println("프로그램 종료");
	}

	// 계좌생성하기
	private static void createAccount() {

		Scanner scanner = new Scanner(System.in); // nextLine()을 쓸 때는 반드시 이게 들어가야 한다!

		System.out.println("------------------------------------------");
		System.out.println("계좌생성");
		System.out.println("------------------------------------------");
		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();

		System.out.print("계좌주 : ");
		String owner = scanner.nextLine();

		System.out.print("초기입금액 : ");
		int balance = scanner.nextInt();

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				accountArray[i] = new Account(ano, owner, balance);
				System.out.println("결과 : 계좌가 생성되었습니다.");
				break;
			}
		}
	}

	// 계좌목록보기
	private static void accountList() {
		System.out.println("------------------------------------------");
		System.out.println("계좌목록");
		System.out.println("------------------------------------------");

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] != null) {
				accountArray[i].show();
			}
		}
	}

	// 예금하기
	private static void deposit() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("예금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("예금액 : ");
		int newbalance = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			findAccount(ano).setBalance(findAccount(ano).getBalance() + newbalance);
			System.out.println("결과 : 입금이 성공되었습니다.");
		}
	}

	// 출금하기
	private static void withdraw() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("출금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("출금액 : ");
		int newbalance2 = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			if (newbalance2 > findAccount(ano).getBalance()) {
				System.out.println("잔액보다 큰 액수를 입력하셨습니다.");
			} else {
				findAccount(ano).setBalance(findAccount(ano).getBalance() - newbalance2);
				System.out.println("결과 : 출금이 성공되었습니다.");
			}
		}
	}

	private static Account findAccount(String ano) {
		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				break;
			}
			if (accountArray[i].getAno().equals(ano)) {
				return accountArray[i];
			}
		}
		return null;

	}

}
package koreaItTest0415;

public class Account {

	private String ano;
	private String owner;
	private int balance;

	public Account(String ano, String owner, int balance) {
		super();
		this.ano = ano;
		this.owner = owner;
		this.balance = balance;
	}

	// Setter와 Getter 메소드 완성

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) { // 계좌번호
		this.ano = ano;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) { // 이름
		this.owner = owner;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) { // 초기입금액
		this.balance = balance;
	}

	// 목록
	void show() {
		System.out.println(ano + " " + owner + " " + balance);
	}
}

findAccount 메서드를 전혀 활용하지 못했고 문제에서 요구했던 nextLine 을 쓰지 못했다.

시험 끝나고 여쭤보니 강사님이 버퍼에 대해 설명을 많이 해주셨다고 했는데 난 기억이 하나도 안났다..

진짜 출력만 겨우 됐는데 그 마저도 뭔가 중간중간 문제가 생겨서 속이 썩어들어갔다.

 

답답한 마음에 남아서 이것저것 고쳐보고 찾아보면서 결국 다시 풀었는데 다 하고 나니까 이렇게 직관적으로 생각하면 더 쉽게 풀렸을 텐데 뭘 그렇게 꼬아서 생각하고 감을 못잡았나 싶었다.. 사실 감을 되게 늦게 잡기도 했고 다시 봐도 나 혼자 구글에 뭐 물어보고 그냥 코드만 짜보라고 하면 못할 것 같다.. 어느 정도 가지고 있다 안풀리면 그냥 무식하게 계속 코드를 따라 써보기라도 해야겠다. 그리고 보고 또 보고 계속 보며 분석을 하면 괜찮게 쓰여진 남의 코드들이 익숙해서 조금이라도 닮게 되지 않을까?ㅜ

문제가 다행히 책에 나온 거기도 하고 많이 풀리는 예제라 어렵지 않게 찾아서 도움을 받을 수 있었다. 이제 이해를 좀 잘해서 제발 스스로 이렇게 풀어보자..

 

오답노트 :

package koreaItTest0415;

import java.util.Scanner;

public class BankApplication {
	private static Account[] accountArray = new Account[100];
	private static Scanner scanner = new Scanner(System.in);

	public static void main(String[] args) {
		boolean run = true;
		while (run) {
			System.out.println("------------------------------------------");
			System.out.println("1.계좌생성 | 2.계좌목록 | 3.예금 | 4.출금 | 5.종료");
			System.out.println("------------------------------------------");
			System.out.print("선택> ");

			int selectNo = scanner.nextInt();

			if (selectNo == 1) {
				createAccount();
			} else if (selectNo == 2) {
				accountList();
			} else if (selectNo == 3) {
				deposit();
			} else if (selectNo == 4) {
				withdraw();
			} else if (selectNo == 5) {
				break;
			}
		}
		System.out.println("프로그램 종료");
	}

	// 계좌생성하기
	private static void createAccount() {

		Scanner scanner = new Scanner(System.in); // nextLine()을 쓸 때는 반드시 이게 들어가야 한다!

		System.out.println("------------------------------------------");
		System.out.println("계좌생성");
		System.out.println("------------------------------------------");
		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();

		System.out.print("계좌주 : ");
		String owner = scanner.nextLine();

		System.out.print("초기입금액 : ");
		int balance = scanner.nextInt();

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				accountArray[i] = new Account(ano, owner, balance);
				System.out.println("결과 : 계좌가 생성되었습니다.");
				break;
			}
		}
	}

	// 계좌목록보기
	private static void accountList() {
		System.out.println("------------------------------------------");
		System.out.println("계좌목록");
		System.out.println("------------------------------------------");

		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] != null) {
				accountArray[i].show();
			}
		}
	}

	// 예금하기
	private static void deposit() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("예금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("예금액 : ");
		int newbalance = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			findAccount(ano).setBalance(findAccount(ano).getBalance() + newbalance);
			System.out.println("결과 : 입금이 성공되었습니다.");
		}
	}

	// 출금하기
	private static void withdraw() {

		Scanner scanner = new Scanner(System.in);

		System.out.println("------------------------------------------");
		System.out.println("출금");
		System.out.println("------------------------------------------");

		System.out.print("계좌번호 : ");
		String ano = scanner.nextLine();
		System.out.print("출금액 : ");
		int newbalance2 = scanner.nextInt();

		if (findAccount(ano) == null) {
			System.out.println("결과 : 계좌가 없습니다.");
		} else {
			if (newbalance2 > findAccount(ano).getBalance()) {
				System.out.println("잔액보다 큰 액수를 입력하셨습니다.");
			} else {
				findAccount(ano).setBalance(findAccount(ano).getBalance() - newbalance2);
				System.out.println("결과 : 출금이 성공되었습니다.");
			}
		}
	}

	private static Account findAccount(String ano) {
		for (int i = 0; i < accountArray.length; i++) {
			if (accountArray[i] == null) {
				break;
			}
			if (accountArray[i].getAno().equals(ano)) {
				return accountArray[i];
			}
		}
		return null;

	}

}
package koreaItTest0415;

public class Account {

	private String ano;
	private String owner;
	private int balance;

	public Account(String ano, String owner, int balance) {
		super();
		this.ano = ano;
		this.owner = owner;
		this.balance = balance;
	}

	// Setter와 Getter 메소드 완성

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) { // 계좌번호
		this.ano = ano;
	}

	public String getOwner() {
		return owner;
	}

	public void setOwner(String owner) { // 이름
		this.owner = owner;
	}

	public int getBalance() {
		return balance;
	}

	public void setBalance(int balance) { // 초기입금액
		this.balance = balance;
	}

	// 목록
	void show() {
		System.out.println(ano + " " + owner + " " + balance);
	}
}

Account 는 그나마 같구나;; 하긴 마법사도 사용 못하면 문제가 심각한거지ㅋ..

작성 : 2024. 4. 12. 

 

배열을 잘 못쓰는 것 같아서 수업 전에 예제를 찾아 간단하게 풀어봤다.

배열관련 예제 

package practice;

public class ArraysPractice {

	public static void main(String[] args) {
		// 배열관련예제 01.

		// 길이가 10인 배열을 선언하고
		// 1부터 10까지의 값을 반복문을 이용하여 순서대로 배열 인덱스에 넣은 후 그 값을 출력하세요.

		int[] arr = new int[10];

		for (int i = 0; i < arr.length; i++) {
			arr[i] = i + 1;
			System.out.print(arr[i] + " ");
		}

		System.out.println();

		// 배열관련예제 02.

		// 길이가 10인 배열을 선언하고 1부터 10까지의 값을 반복문을 이용하여
		// 역순으로 배열 인덱스에 넣은 후 그 값을 출력하세요.

		int[] arr2 = new int[10];
		int num = arr.length;

		for (int i = 0; i < arr.length; i++) {
			arr2[i] = num;
			num--;
		}

		// 하나씩 차례대로 배열값에 수들을 넣어주는 코드
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr2[i] + " ");
		}
	}

}

 

학생성적 관리 시스템을 만들어보자

학생성적관리시스템

package etc0411;

public class ScoreData {
	// 한 학생의 이름과 성적을 변수로 저장
	
	String name;
	int java;
	int kor;
	int eng;
	int math;

	public ScoreData(String name, int java, int kor, int eng, int math) {
		super();
		this.name = name;
		this.java = java;
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
	void show() {
		System.out.println("이름 : " + name );
		System.out.println("자바 점수 : " + java + ", 국어 점수 : " + kor + ", 영어 점수 : " + eng + " , 수학 점수 : " + math);
	}
	

}

 

package etc0411;
// 성적산출프로그램

import java.util.Scanner;

public class ScoreTest {
	
	final int columns = 10;
    final int rows = 6;


	// 멤버 변수 만들기

	// ScoreData 타입의 배열
	static ScoreData[] scoreData = new ScoreData[10];
	// 성적을 입력받아야 함.
	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		int menu;

		while (true) {
			// 단위테스트를 하고 넘어가야함.
			showMenu();
			System.out.println("메뉴 선택 : ");
			menu = sc.nextInt();

			// 입력받은 번호 비교
			if (menu == 1) {
				showAllScore();
			} else if (menu == 2) {
				registerScore();
			} else if (menu == 3) {
				searchScoreByName();
			} else if (menu == 4) {
				deletScoreByNum();
			} else if (menu == 0) {
				System.out.println("프로그램 종료");
				break;
			}
		}

	}

	static void showMenu() {
		// 전체 선택할 메뉴
		System.out.println("--------------------------");
		System.out.println("1. 전체 성적 조회");
		System.out.println("2. 성적 등록");
		System.out.println("3. 성적 검색");
		System.out.println("4. 성적 삭제");
		System.out.println("0. 종료");
		System.out.println("--------------------------");
	}

	static void showAllScore() {
		System.out.println("전체 성적 조회");
//		if (scoreData.length == 0) {
//			System.out.println("저장된 성적데이터가 없습니다.");
//			return;
//		}

-----------------------------------------------------------------------------
-> 강사님이 처음에 이렇게(주석 건 코드) 알려줬는데 해보니 
"저장된 성적데이터가 없습니다." 메세지가 나오지 않음. 그래서 아래 코드로 내가 바꿔보았다.

		for (int i = 0; i < scoreData.length; i++) {
			if (scoreData[i] == null) {
				System.out.println("저장된 성적데이터가 없습니다.");
				return;
			} else if (scoreData[i] != null) {
				System.out.print((i + 1) + "번 - ");
				scoreData[i].show(); 
			}
		}
	}
	
-> 이렇게 하면 성적 데이터가 없을 때 "저장된 성적데이터가 없습니다." 메세지는 나오지만 
성적 데이터가 있을 때도 나옴..

결국 강사님께 이 문제를 말씀드리고 함께 코드를 수정함.
-----------------------------------------------------------------------------
	
	static void showAllScore() {
		System.out.println("전체 성적 조회");

		boolean flag = false;
		for (int i = 0; i < scoreData.length; i++) {
			if (scoreData[i] != null) {
				flag = true;
				System.out.print((i + 1) + "번 - ");
				scoreData[i].show(); // null 체크를 반드시 해야 오류가 생기지 않음.
			}
		}

		if (!flag) {
			System.out.println("저장된 성적데이터가 없습니다.");
		}

	}
	
	-> 수정된 코드. 잘 돌아감! 
 

	static void registerScore() {
		System.out.println("성적 등록");
		System.out.println("이름 : ");
		String name = sc.next();

		System.out.println("자바 : ");
		int java = sc.nextInt();
		System.out.println("국어 : ");
		int kor = sc.nextInt();
		System.out.println("영어 : ");
		int eng = sc.nextInt();
		System.out.println("수학 : ");
		int math = sc.nextInt();

		// new ScoreData(name, java, kor, eng, math);
		for (int i = 0; i < 10; i++) {
			if (scoreData[i] == null) {
				scoreData[i] = new ScoreData(name, java, kor, eng, math);
				System.out.println("등록 완료");
				break;
			}
		}
	}

	// 학생 이름을 통해 성적을 찾아보겠다
	static void searchScoreByName() {
		System.out.println("성적 검색");
		System.out.print("검색할 이름을 입력하세요 : ");
		String name = sc.next(); // next 는 공백을 포함한 문자를 못받음. nextline 은 공백을 받을 수 있음
		// 찾으면 찾았다고, 못찾으면 못찾았다고 판단
		boolean found = false;
		for (int i = 0; i < 10; i++) {
			// 배열 안의 값이 널이 아니면서 이름이 같을 때
			if (scoreData[i] != null && (scoreData[i].name).equals(name)) { // equals(name) 이름이 같은지 판단
				System.out.println(name + "을(를) 찾았습니다.");
				scoreData[i].show();
				found = true;
				break; // 찾았다면 반복문 끝내기
			}
		}
		// 열번 도는 동안 검색하는 학생의 이름을 찾지 못했을 때
		if (!found) {
			System.out.println("이름 검색에 실패했습니다.");
		}
	}

	static void deletScoreByNum() {
		System.out.println("성적 삭제");
		System.out.println("삭제할 성적데이터의 번호를 입력하세요 : ");
		int select = sc.nextInt();

		// 배열에서 삭제를 한다는 것은 null 로 만들어버리는 것
		if (scoreData[select - 1] == null) {
			System.out.println("일치하는 성적 데아터가 없습니다.");
			return;
		} else {
			scoreData[select - 1] = null;
			System.out.println("성적 데이터가 삭제 되었습니다.");
		}
	}

}

 

  • 미니 프로젝트 미션 - 예약 시스템을 만들어 보세요.
  1. 변수를 어떻게 사용할지 공통 부분에 대한 약속
  2. 메뉴 정하기 → 예약조회, 예약, 수정, 삭제,
  3. 주제는 아무거나 가능 (기차, 비행기 … 등등)

영화관 예매

빙고판으로 1관, 2관, 3관 예약자 이름, 연락처, 영화 이름, 좌석, 인원수

프린터 영화 목록 뽑고 시간, 좌석선택, 시간선택

영화 목록,시간 보여주기- a

영화 예매 (좌석선택, 영화이름, 인원수)- b

예약자 이름으로 예약 확인- 유나 me

예약자 이름으로 예약 취소- c

예약자 이름으로 수정 (삭제후 재등록)- a

 

 

 

영화관 예매 시스템

🙉 조원들과 만든 코드의 현재 진행상황

// 예약확인에서 좌석번호가 나타나지 않는 이슈

// 예약취소 후 취소된 예약내역을 확인 할 수 없음

// 예약확인에서 예약되지 않은 사람의 이름을 입력하면 “예약 내역이 없습니다”등의 메세지가 없음 → 현재 아무런 일이 일어나지 않고 다시 돌아가는 구조

// “예약 내역 수정을 위해 영화를 다시 선택해주세요” 와 같이 사용자가 지금 자신이 무엇을 하고 있는지 다시 알려줄 수 있는 메세지 출력

// 예약 수정을 하면 예약이 취소됨과 동시에 재예약이 진행되기 때문에 예약이 취소되었습니다와 예약이 완료되었습니다 메세지가 같이 출력되는데 “예약이 수정되었습니다”라고 메세지를 보여주고 수정된 예약 정보를 같이 띄워주면 좋을 것 같음

package Reservation0412;

import java.util.Scanner;

public class MovieReservation {

	   static String name;
	   static int movieentrance;
	   static int movieTime;
	   public static int seatNumber;

	   // 멤버 변수 만들기

	   // ReservationData 타입의 배열
	   static ReservationData[] reservationData = new ReservationData[1];
	   // 예약자 이름, 연락처, 영화 이름, 좌석 등을 입력받아야 함.
	   static Scanner sc = new Scanner(System.in);

	   public static void main(String[] args) {
	      reservationData[0] = null;
	      int menu;

	      while (true) {
	         showMenu();
	         System.out.print("메뉴 선택 : ");
	         menu = sc.nextInt();

	         // 입력받은 번호 비교
	         if (menu == 1) {
	            showAllMovie(); // 영화 목록,시간 보여주기 - a
	         } else if (menu == 2) {
	            reservationMovie(); // 영화 예매 (좌석선택, 영화이름, 인원수) - b
	         } else if (menu == 3) {
	            searchReservationByName(); // 예약자 이름으로 예약 확인 - 유나 me
	         } else if (menu == 4) {
	            deletReservationByName(); // 예약자 이름으로 예약 취소 - c
	         } else if (menu == 5) {
	            ReservationReChoice(); // 예약자 이름으로 수정 (삭제후 재등록) - a
	         } else if (menu == 0) {
	            System.out.println(" 프로그램 종료 ");
	            break;
	         }
	      }

	   }

	   static void showMenu() {
	      // 전체 선택할 메뉴
	      System.out.println("—————————————");
	      System.out.println("1. 현재 상영하는 영화 확인하기");
	      System.out.println("2. 영화 예매하기");
	      System.out.println("3. 예약 확인");
	      System.out.println("4. 예약 취소");
	      System.out.println("5. 예약 수정");
	      System.out.println("0. 종료");
	      System.out.println("—————————————");
	   }

	   static void showAllMovie() {
		   System.out.println();
	      System.out.println("1관 파묘: 11:20  17:20   ");
	      System.out.println("2관 범죄도시: 11:20  17:20  ");
	   }

	   static void reservationMovie() {
	      if (reservationData[0] == null) {
	         System.out.print("이름을 입력해주세요: ");
	         name = sc.next();
	         System.out.print("영화를 선택해주세요. 1.파묘 2.범죄도시 >>");
	         movieentrance = sc.nextInt();
	         System.out.print("시간을 선택해주세요. 1. 11:20 2. 17:20 >>");
	         movieTime = sc.nextInt();

	         파묘1 f1 = new 파묘1();
	         파묘2 f2 = new 파묘2();
	         범죄도시1 b1 = new 범죄도시1();
	         범죄도시2 b2 = new 범죄도시2();

	         if (movieentrance == 1 && movieTime == 1) {
	            f1.movie1();
	         } else if (movieentrance == 1 && movieTime == 2) {
	            f2.movie1();
	         } else if (movieentrance == 2 && movieTime == 1) {
	            b1.movie1();
	         } else if (movieentrance == 2 && movieTime == 2) {
	            b2.movie1();
	         }

	         reservationData[0] = new ReservationData(name, movieentrance, movieTime, seatNumber);
	      } else 
	         System.out.println("예매가 이미 진행되었습니다.");
	   }

	   static void searchReservationByName() {

	      System.out.print("이름을 입력해주세요 :");
	      String name2 = sc.next();
	      if (name2.equals(name)) {
	         reservationData[0].show();
	      }

	   }

	   static void deletReservationByName() {
	      System.out.print("이름 :");
	      String name2 = sc.next();
	      if (name2.equals(name)) {
	    	  reservationData[0] = null;
	    	  System.out.println("예매가 취소되었습니다.");
	      }

	   }

	   static void ReservationReChoice() {
	      System.out.print("이름을 입력해주세요");
	      String name2 = sc.next();
	      if (name2.equals(name)) {
	         reservationData[0] = null;
	         System.out.print("영화를 선택해주세요 1.파묘 2.범죄도시:");
	         movieentrance = sc.nextInt();
	         System.out.print("시간을 선택해주세요 1.11:20 2.17:20:");
	         movieTime = sc.nextInt();
	         파묘1 f1 = new 파묘1();
	         파묘2 f2 = new 파묘2();
	         범죄도시1 b1 = new 범죄도시1();
	         범죄도시2 b2 = new 범죄도시2();

	         if (movieentrance == 1 && movieTime == 1) {
	            f1.movie1();
	         } else if (movieentrance == 1 && movieTime == 2) {
	            f2.movie1();
	         } else if (movieentrance == 2 && movieTime == 1) {
	            b1.movie1();
	         } else if (movieentrance == 2 && movieTime == 2) {
	            b2.movie1();
	         }
	         System.out.println("예약이 취소되었습니다.");
	      } else
	         System.out.println("예약정보없음");

	   }
	}
package Reservation0412;

public class ReservationData {
   String name;

   int movieentrance;
   int movieTime;
   int seatNumber;

   public ReservationData(String name, int movieentrance, int movieTime, int seatNumber) {
      super();
      this.movieentrance = movieentrance;
      this.movieTime = movieTime;
      this.name = name;
      this.seatNumber = seatNumber;
   }

   void show() {
      String movieName;
      String time;
      if (movieentrance == 1) {
         movieName = "파묘";
      } else {
         movieName = "범죄도시";
      }
      if (movieTime == 1) {
         time = "11:20";
      } else {
         time = "17:20";
      }
      System.out.println("이름 : " + name);
      System.out.println("영화 : " + movieName + ", " + "시간 : " + time + ", " + "좌석번호 : " + seatNumber);
   }
}

각 영화를 상영하는 영화관의 좌석에서 예매자의 값을 받기 때문에 상영시간, 영화 별로 클래스를 만들어 놓음.

 

package Reservation0412;

import java.util.Scanner;

public class 범죄도시1 {
	
	   void movie1() {
		      int[][] arr = new int[6][6];
		      for (int i = 0; i < 6; i++) {
		         for (int j = 0; j < 6; j++) {
		            arr[i][j] = j + 1;

		         }
		      }
		      String[] arr2 = { "a열", "b열", "c열", "d열", "e열", "f열" };
		      Scanner in = new Scanner(System.in);

		      for (int i = 0; i < 6; i++) {
		         System.out.print(arr2[i] + " ");
		         for (int j = 0; j < 6; j++) {
		            System.out.print(arr[i][j] + " ");
		         }
		         System.out.println();
		      }
		      System.out.println();

		      int a = 0;
		      System.out.println("열을 선택하세요");
		      String s = in.next();
		      if (s.equals("a")) {
		         a = 0;
		      }
		      if (s.equals("b")) {
		         a = 1;
		      }
		      if (s.equals("c")) {
		         a = 2;
		      }
		      if (s.equals("d")) {
		         a = 3;
		      }
		      if (s.equals("e")) {
		         a = 4;
		      }
		      if (s.equals("f")) {
		         a = 5;
		      }

		      System.out.println("좌석을 선택해주세요");

		      int b = in.nextInt();

		      arr[a][b - 1] = 0;

		      for (int i = 0; i < 6; i++) {
		         System.out.print(arr2[i] + " ");
		         for (int j = 0; j < 6; j++) {
		            System.out.print(arr[i][j] + " ");
		         }
		         System.out.println();

		      }
		      System.out.println("예약이 완료되었습니다.");
		      String seatNumber = s + b;

		   }
		}
package Reservation0412;

import java.util.Scanner;

public class 범죄도시2 {
	
	 void movie1() {
	      int[][] arr = new int[6][6];
	      for (int i = 0; i < 6; i++) {
	         for (int j = 0; j < 6; j++) {
	            arr[i][j] = j + 1;

	         }
	      }
	      String[] arr2 = { "a열", "b열", "c열", "d열", "e열", "f열" };
	      Scanner in = new Scanner(System.in);

	      for (int i = 0; i < 6; i++) {
	         System.out.print(arr2[i] + " ");
	         for (int j = 0; j < 6; j++) {
	            System.out.print(arr[i][j] + " ");
	         }
	         System.out.println();
	      }
	      System.out.println();

	      int a = 0;
	      System.out.println("열을 선택하세요");
	      String s = in.next();
	      if (s.equals("a")) {
	         a = 0;
	      }
	      if (s.equals("b")) {
	         a = 1;
	      }
	      if (s.equals("c")) {
	         a = 2;
	      }
	      if (s.equals("d")) {
	         a = 3;
	      }
	      if (s.equals("e")) {
	         a = 4;
	      }
	      if (s.equals("f")) {
	         a = 5;
	      }

	      System.out.println("좌석을 선택해주세요");

	      int b = in.nextInt();

	      arr[a][b - 1] = 0;

	      for (int i = 0; i < 6; i++) {
	         System.out.print(arr2[i] + " ");
	         for (int j = 0; j < 6; j++) {
	            System.out.print(arr[i][j] + " ");
	         }
	         System.out.println();

	      }
	      System.out.println("예약이 완료되었습니다.");

	      String seatNumber = s + b;

	   }
	}
package Reservation0412;

import java.util.Scanner;

public class 파묘1 {

	   void movie1() {
	      int[][] arr = new int[6][6];
	      for (int i = 0; i < 6; i++) {
	         for (int j = 0; j < 6; j++) {
	            arr[i][j] = j + 1;

	         }
	      }
	      String[] arr2 = { "a열", "b열", "c열", "d열", "e열", "f열" };
	      Scanner in = new Scanner(System.in);

	      for (int i = 0; i < 6; i++) {
	         System.out.print(arr2[i] + " ");
	         for (int j = 0; j < 6; j++) {
	            System.out.print(arr[i][j] + " ");
	         }
	         System.out.println();
	      }
	      System.out.println();

	      int a = 0;
	      System.out.println("열을 선택하세요");
	      String s = in.next();
	      if (s.equals("a")) {
	         a = 0;
	      }
	      if (s.equals("b")) {
	         a = 1;
	      }
	      if (s.equals("c")) {
	         a = 2;
	      }
	      if (s.equals("d")) {
	         a = 3;
	      }
	      if (s.equals("e")) {
	         a = 4;
	      }
	      if (s.equals("f")) {
	         a = 5;
	      }

	      System.out.println("좌석을 선택해주세요");

	      int b = in.nextInt();

	      arr[a][b - 1] = 0;

	      for (int i = 0; i < 6; i++) {
	         System.out.print(arr2[i] + " ");
	         for (int j = 0; j < 6; j++) {
	            System.out.print(arr[i][j] + " ");
	         }
	         System.out.println();

	      }
	      System.out.println("예약이 완료되었습니다.");

	      String seatNumber = s + b;

	   }
	}
package Reservation0412;

import java.util.Scanner;

public class 파묘2 {
	
	void movie1() {
	      int[][] arr = new int[6][6];
	      for (int i = 0; i < 6; i++) {
	         for (int j = 0; j < 6; j++) {
	            arr[i][j] = j + 1;

	         }
	      }
	      String[] arr2 = { "a열", "b열", "c열", "d열", "e열", "f열" };
	      Scanner in = new Scanner(System.in);

	      for (int i = 0; i < 6; i++) {
	         System.out.print(arr2[i] + " ");
	         for (int j = 0; j < 6; j++) {
	            System.out.print(arr[i][j] + " ");
	         }
	         System.out.println();
	      }
	      System.out.println();

	      int a = 0;
	      System.out.println("열을 선택하세요");
	      String s = in.next();
	      if (s.equals("a")) {
	         a = 0;
	      }
	      if (s.equals("b")) {
	         a = 1;
	      }
	      if (s.equals("c")) {
	         a = 2;
	      }
	      if (s.equals("d")) {
	         a = 3;
	      }
	      if (s.equals("e")) {
	         a = 4;
	      }
	      if (s.equals("f")) {
	         a = 5;
	      }

	      System.out.println("좌석을 선택해주세요");

	      int b = in.nextInt();

	      arr[a][b - 1] = 0;

	      for (int i = 0; i < 6; i++) {
	         System.out.print(arr2[i] + " ");
	         for (int j = 0; j < 6; j++) {
	            System.out.print(arr[i][j] + " ");
	         }
	         System.out.println();

	      }
	      System.out.println("예약이 완료되었습니다.");
	      String seatNumber = s + b;

	   }
	}

진행하며 느낀 나의 문제들 → 내가 원래 했던 방향은 ReservationData[] 에 예약자의 정보를 저장하려 했었다. 그래서 내가 맡은 부분의 ‘예약자 이름으로 예약확인’ 부분에서 for문을 사용해 ReservationData[]에 저장된 예약자들의 이름을 돌려 확인할 수 있게 만들었다. 조원들과 미션을 진행하며 각 자 맡은 메서드를 작성할 수 있도록 내가 전체적인 틀을 제공해줬는데 ReservationData[]라는 변수의 사용에 대해 정확하게 이야기를 하지 않고 넘어가 이런 오해가 생긴 것 같다. 변수명이 다른 팀원들이 알아 볼 수 있을 정도로 직관적이라고 생각했는데 다음에는 더 확실하게 이해할 수 있도록 주석을 달아줘야겠다. 큰 실수는 아니라 다행히 내 코드가 돌아가는 것에는 문제가 없었지만 예약자 정보를 담는 공간이 없으니 다른 예약자들이 예약을 할 수가 없다. 오직 한 사람의 영화 예약을 위해 예약 프로그래밍을 짠 것!

여러 사람들이 예약을 할 수 있도록 예약자 내역을 받는 변수를 꼭 만들어야겠다.

느낀 점 → 내 옆자리의 천재분이 내가 제공한 틀을 제외한 거의 모든 것들을 다 만드셨는데.. 일단 감정적으로는 회의감을 가장 많이 느낀 것 같다. 같은 시간을 투자해도 이런 다른 결과를 내는 사람이 있다는 것이 많이 자극이 되었고 걱정되고 초조해지기도 했다. 그래도 배운 것들을 내가 이해하고 아주 조금씩 응용을 할 수 있다는 것은 희망적이다. 단위평가 때는 또 어떨지 자신이 없지만.. 일단 이번 팀원들이 프로그래밍에 대해 열의가 있고 욕심이 있어서인지 점점 하다보면 범위가 넓어졌다. 내가 생각하지 못했던 기능들을 막 구현하려 하기도 하고! 그래서 따라가기가 벅차기도 했지만 꽤 재밌기도 했다. 뭔가 이번 주말에도 새로운 것을 구현하고 좀 알아가야 할 것 같다..

하지만 여전히 이해되지 않는 부분들이 있으므로 일단 코드를 잘 분석해보고, 수정하고 싶은 방향에 맞게 나름 조금씩 건드려 볼 예정이다.

내가 짠 전체적인 틀과 코드 (거의 강사님꺼에서 변수명만 바꾸고 복붙;;)

package Reservation0412;

import java.util.Scanner;

public class ReservationTest {

	// 멤버 변수 만들기

	// ReservationData 타입의 배열
	static ReservationData[] reservationData = new ReservationData[1];
	// 예약자 이름, 연락처, 영화 이름, 좌석, 인원수 등을 입력받아야 함.
	static Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {

		int menu;

		while (true) {
			// 단위테스트를 하고 넘어가야함.
			showMenu();
			System.out.print("메뉴 선택 : ");
			menu = sc.nextInt();

			// 입력받은 번호 비교
			if (menu == 1) {
				showAllMovie(); // 영화 목록,시간 보여주기 - 나실
			} else if (menu == 2) {
				reservationMovie(); // 영화 예매 (좌석선택, 영화이름, 인원수) - 기웅
			} else if (menu == 3) {
				searchReservationByName(); // 예약자 이름으로 예약 확인 - 유나
			} else if (menu == 4) {
				deletReservationByName(); // 예약자 이름으로 예약 취소 - 정우
			} else if (menu == 5) {
				ReservationReChoice(); // 예약자 이름으로 수정 (삭제후 재등록) - 나실
			} else if (menu == 0) {
				System.out.println(" 프로그램 종료 ");
				break;
			}
		}

	}

	static void showMenu() {
		// 전체 선택할 메뉴
		System.out.println("--------------------------");
		System.out.println("1. 현재 상영하는 영화 확인하기");
		System.out.println("2. 영화 예매하기");
		System.out.println("3. 예약 확인");
		System.out.println("4. 예약 취소");
		System.out.println("5. 예약 수정");
		System.out.println("0. 종료");
		System.out.println("--------------------------");
	}

	static void showAllMovie() {
		System.out.println("1관 파묘: 11:20  17:20   ");
		System.out.println("2관 범죄도시: 11:20  17:20  ");
	}

	static void reservationMovie() {
		
	}

	static void searchReservationByName() {
		System.out.println("예약 확인");
		System.out.print("예약자의 성함을 입력하세요 : ");
		String name = sc.next();
	
		// 찾으면 찾았다고, 못찾으면 못찾았다고 판단
		boolean found = false;
		for (int i = 0; i < 10; i++) {
			// 배열 안의 값이 널이 아니면서 이름이 같을 때
			if (reservationData[i] != null && (reservationData[i].name).equals(name)) {
				System.out.println(name + "의 예약 내역을 확인해드리겠습니다. ");
				reservationData[i].show();
				found = true;
				break; // 찾았다면 반복문 끝내기
			}
		}
		// 열번 도는 동안 예약자의 이름을 찾지 못했을 때
		if (!found) {
			System.out.println("예약 정보를 찾을 수 없습니다.");
		}
	}

	static void deletReservationByName() {


	   }

	static void ReservationReChoice() {


	}
}

 

 

  • 예외처리

참조) https://velog.io/@codepark_kr/%EC%9E%90%EB%B0%94-%EC%9D%B4%EB%A1%A0-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC

키워드 : 이퀄스와 헤쉬코드, 오버라이딩

나중에 컬렉션을 배울 때 필요,,

package etc0411;

import java.util.Objects;

@NoArgsConstructor      // 롬북을 이용해 기본생성자를 만들어줌!!
@AllArgsConstructor
@EqualsAndHashCode
public class Person {
	long id;
	String name;

//	public Person(long id, String name) {
		// TODO Auto-generated constructor stub
//	}

	
	// equals 를 오버라이딩하면 hashCode 도 오버라이딩한다.
	// hashCode 값은 고유하다.

//	public void setId(long id, String name) {
//		this.id = id;
//		this.name = name;
//	}
//
//	@Override
//	public boolean equals(Object obj) {
//		
//		Person other = null;  // 선언을 위에서
//		
//		if (obj instanceof Person) {
//		other = (Person)obj;
//		}
//		// 아이디와 이름 비교해서 똑같을 때 같은 객체로 판단하겠다
//		return this.id == other.id && (this.name).equals(other.name); 
//	}
//	
//	@Override
//	public int hashCode() {
//		// hashCode 가 똑같으면 똑같은 개체로 판단한다.
//		return Objects.hash(id, name);
//	}
//	
//	


}
package etc0411;

public class PersonTest {

	public static void main(String[] args) {
		Person p1 = new Person(1111111, "홍길동");
		Person p2 = new Person(1111111, "홍길동");     
		
		// 주소값을 비교하면 다르게 나오지만 값을 직접 비교하도록 오버라이딩하면 값을 비교할 수 있다.
		
		if (p1.equals(p2)) {  // 객체를 비교할 땐 equals 사용
			System.out.println("같습니다.");
		} else {
			System.out.println("다릅니다.");
		}
		
		System.out.println(p1.hashCode());
		System.out.println(p2.hashCode());

	}

}
package etc0411;

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.ToString;

//0412

@NoArgsConstructor      // 롬북을 이용해 기본생성자를 만들어줌!!
@AllArgsConstructor
@ToString(exclude = "name") // (exclude = "name") <- 빼고 싶은 요소가 있을 때
public class Student {
	String name;
	int age;
	int grade;
	int ban;
	int no;
	
	
//	public Student(String name, int age, int grade, int ban, int no) {
//		super();
//		this.name = name;
//		this.age = age;
//		this.grade = grade;
//		this.ban = ban;
//		this.no = no;
//	}
//	
//	// 기본생성자는 습관적으로 쓴다!
//	// 어떤 역할을 하든 안하든 코딩할때 기본
//	public Student() {
//		
//	}
//
//	@Override
//	public String toString() {
//		return "Student [name=" + name + ", age=" + age + ", grade=" + grade + ", ban=" + ban + ", no=" + no + "]";
//	}
//	

}
package etc0411;
//0412
public class StudentTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Student s = new Student("홍길동", 10, 1, 1, 10);
		System.out.println(s.toString());

	}

}

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0416  (1) 2024.05.29
UIUX _국비과정 0415  (0) 2024.05.29
UIUX _국비과정 0411  (0) 2024.05.29
UIUX _국비과정 0409  (0) 2024.05.29
UIUX _국비과정 0408  (0) 2024.05.29

작성 : 2024. 4. 11. 

 

  • 다향성과 관련된 추상 클래스
package polymorphism;

public abstract class AbstractClass {
	// abstract 라고 붙여지면 추상 클래스
	
	// 추상 클래스의 특징
	// abstract 키워드를 선언한다.
	// 추상 메서드는 멤버변수, 메서드, 생성자와는 다름 (추상 메서드는 선언부만 있고 구현부는 없다)
	// 객체생성이 불가
	// 상속만 가능하다.
	// 자식클래스 반드시 추상 메서드를 오버라이딩 해야한다.
	
	// 추상 클래스에 아래의 형식이 다 들어갈 수 있음
	int x;
	int y; 
	
	AbstractClass() {
		
	}
	
	// 접근제한자 생략 가능
	void add() {
		System.out.println (2 + 3);
	}
	
	abstract void play(int pos); // 추상 메서드

}

 

 

  • extends AbstractClass 한 자식 클래스
package polymorphism;

public class AbstractChild extends AbstractClass {

	@Override
	void play(int pos) {
		System.out.println("play");
	}

}

 

  • 상속 시, 하위 객체(자식)는 상위 객체(부모)의 특징(메소드, 변수 등)을 물려받게 된다.
  • 이 때, 상위 객체(부모)의 특징(메소드, 변수 등)을 '새롭게 구현'하는가, '그대로 사용'하는가에 따라서 상속의 형태가 갈리게 된다.

 

  • extends
    • 부모에서 선언/정의를 모두하며, 자식은 오버라이딩 할 필요 없이 부모의 메소드/변수를 그대로 사용할 수 있다.
    • "부모의 특징을 연장해서 사용한다."라고 기억하면 될 듯!
  • implements (interface 구현)
    • 부모 객체는 선언만 하며, 정의는 반드시 자식이 오버라이딩해서 사용한다.
    • "부모의 특징을 도구로 사용해 새로운 특징을 만들어 사용한다."라고 기억하면 될 듯!
  • abstract
    • extends와 interface의 혼합이다.
    • extends를 사용하지만, 몇 개는 추상 메소드로 구현되어 있다.

 

참조 ) 

 

[Java] extends, implements의 차이

상속(Inheritance)이란? 상속에 대해서 다루기 전에 우선, OOP(Object-Oriented Programming, 객체지향프로그래밍)가 무엇인지에 대해 알고 있어야한다. OOP는 다음과 같은 특징을 가지고 있다. 상속과 인터페

wooono.tistory.com

 

 

  • 인터페이스

 

형식 :

interface 인터페이스명 {

변수

메서드 3 가지

}

 

4가지의 요소가 들어감 : 변수, 메서드 (추상 메서드, 기본 메서드(구현부 존재), 클래스 메서드(구현부 존재))

추상 메서드 - 오버라이딩 가능

기본 메서드 - 오버라이딩 가능

클래스 메서드 - 오버라이딩이 안된다!

강사님이 어노테이션 어노테이션 하길래 몰라서 찾아봄..

어노테이션은 다른 프로그램에게 유용한 정보를 제공하기 위해 사용되는 것으로 주석과 같은 의미를 가진다.

인터페이스는 안에 아무 내용이 없어도 된다

다향성만 이용하고 싶다면 추상 클래스 사용하지 않고 인터페이스만 사용 가능

package polymorphism;

public interface Interfaceable {
	// 인터페이스를 만들 때 관습적으로 able 를 붙임
	
	// 인터페이스의 특징
	// 변수 : public static final
	// 메서드 : public abstract void add();
	// 객체생성이 불가
	// 상속만 가능
	// 자식 클래스는 반드시 추상 메서드 오버라이딩
	// public static final, public abstract 생략 가능
	// 인터페이스간 상속이 가능하다
	// 자식클래스에게 다중 상속이 가능하다
	
	public static final int MAX = 0; // 초기화하고 사용
	public abstract void add();
	
	default void dafaultMethod() {
		
	}
	
	static int getHour() {
		return 0; 
	}

}
// 인터페이스를 상속받는 클래스
package polymorphism;

public class ChildImpl implements Interfaceable {
	// 인터페이스를 상속받는 클래스는 Impl 라는 이름을 붙임

	@Override
	public void add() {
		// TODO Auto-generated method stub
		
	}
}

 

 

  • 게임 만들기
// 0411 유닛들의 부모 클래스

package polymorphism;

public abstract class Unit {
	
	// 추상 메서드의 목적은 자식이 반드시 오버라이딩
	// 왜 자식들에게 오버라이딩 할까
	// 자식들이 상황에 맞춰 수정해서 사용할 수 있도록 큰 틀을 주는 것
	int x;
	int y;
	
	// 움직이는 기능 
	// 추상 메서드 만들기
	// abstract 쓸 때는 클래스 이름 앞에도 abstract 붙이기
	abstract void move(int x, int y);
	
	// 멈추는 기능
	void stop() {
		
	}
	
	// 공통된 코드들은 부모클래스에 넣기

}
package polymorphism;
// 유닛
public class Tank extends Unit{
	
	
	// tank 만의 기능
	void changeMode() {
		
	}
	
	@Override
	void move(int x, int y) {
		
	}

}
package polymorphism;
// 유닛
public class Marine extends Unit{
	
	// marine 이라는 캐릭터가 게임에서 할 수 있는 것
	void sticPack() {
		
	}
	
	@Override
	void move(int x, int y) {
		
	}

}
package polymorphism;
// 유닛
public class Dropship extends Unit{
	
	// dropship은 공중에서 움직이는 캐릭터
	// x, y 의 범위가 다름
	
	void load() {
		
	}
	
	@Override
	void move(int x, int y) {
		
	}

}
package polymorphism;

public class Fighter extends Unit implements Fightable{

	@Override
	void move(int x, int y) {
		// TODO Auto-generated method stub

	}
}
//0411
package polymorphism;

public interface Fightable extends Moveable, Attacktable {
	// 인터페이스 간에는 다중 상속 가능

}

 

//0411
package polymorphism;

public interface Attacktable {

}

 

인터페이스와 상속의 차이점

자바에서 인터페이스와 상속은 코드 재사용과 다형성을 실현하는 방법이지만, 몇 가지 주요 차이점이 있습니다.

  • 인터페이스는 클래스가 어떤 행동을 해야하는지 지정하는 반면, 상속은 클래스가 어떻게 동작하는지 지정합니다.
  • 인터페이스는 클래스가 여러 개를 동시에 구현할 수 있지만, 클래스는 상속을 통해 하나의 클래스만 확장할 수 있습니다.
  • 인터페이스는 메서드와 상수만 포함할 수 있지만, 추상 클래스(상속의 한 형태)는 메서드, 변수, 그리고 생성자를 포함할 수 있습니다.
  • 인터페이스는 모든 메서드가 기본적으로 public이며, 모든 변수는 public static final입니다. 반면, 클래스는 다양한 접근 제어자를 가질 수 있습니다.

이러한 차이점들은 상황에 따라 인터페이스와 상속 중 어떤 것을 사용할지 결정하는 데 도움을 줄 수 있습니다.

인터페이스의 용도가 굉장히 많음!

 

  • 인터페이스를 이용한 간단한 게임 만들기
// 조상클래스

package Interfaces;

public class Unit {
	int hitPoint;
	final int MAX_HP;
	
	Unit(int hp) {
		MAX_HP = hp;
	}

}
// 부모 - 지상에서 싸우는 애들

package Interfaces;

public class GroundUnit extends Unit {

	GroundUnit(int hp) {
		super(hp);
	}

}
// 지상에서 싸우는 애 Tank

package Interfaces;

public class Tank extends GroundUnit implements Repairable {

	Tank() {
		super(150);
		hitPoint = MAX_HP;
	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Tank";
	}
	

}
// 하늘에서 싸우는 애 Dropship

package Interfaces;

public class Dropship extends AirUnit implements Repairable {

	Dropship() {
		super(125);
		hitPoint = MAX_HP;
	}
	
	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Dropship";
	}

}

 

마린 빼고 SCV, 드랍쉽, 탱크는 치료할 수 있게

1. 일단, 묶기 위해 인터페이스 만들기

package Interfaces;

public interface Repairable {

}

 

 

2. SCV, 드랍쉽, 탱크에 implements Repairable 추가

+마린도 치료 기능 추가하기 위해 madic 만들기

package Interfaces;

public class Madic extends GroundUnit implements Repairable2 {

	Madic() {
		super(30);
		hitPoint = MAX_HP;
	}

	void repair(Repairable2 r) {
		Unit u = (Unit) r;

		while ((u.hitPoint) != u.MAX_HP) {
			u.hitPoint++;
		}
		System.out.println(u + "의 수리가 완료!");

	}

	@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "Madic";
	}
}

 

 

이제 위 코드들을 테스트할 메인함수 만들기!

package Interfaces;

public class UnitTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Marine mr = new Marine();
		Tank tk = new Tank();
		SCV scv = new SCV();
		Madic md = new Madic();
		
		// ***** 경로 잘 설계..!
		
		scv.repair(tk);
		// scv.repair(mr); // 안된다!
		md.repair(mr);
		// md.repair(tk); // 안된다!
		
	}

}

 

 

 

 

  • 포함관계를 알아보기 위한 코드
package Interfaces;

//0411
public class Tv {
	// 상속이 아닌 모든 관계를 포함관계라고 한다
	// 포함관계를 알아보기 위한 코드

	// LgSpeak lgSpeak;
	// SmSpeak smSpeak;

	Speakable speak;

	public Tv(Speakable speak) {
		this.speak = speak;
	}

//	public Tv(SmSpeak smSpeak) {
//		this.smSpeak = smSpeak;
//	}

	void speakSound() {
		speak.sound();
	}

}
package Interfaces;

public class LgSpeak implements Speakable {
	public void sound() {
		System.out.println("LgSpeak 소리입니다.");
	}

}
package Interfaces;

public class SmSpeak implements Speakable {
	public void sound() {
		System.out.println("SmSpeak 소리입니다.");
	}

}
package Interfaces;

public class AppleSpeak implements Speakable {

	@Override
	public void sound() {
		System.out.println("AppleSpeak 소리입니다.");
	}

}

 

위 엘지스피커, 삼성스피커, 애플스피커와 같은 스피커들 뿐 아니라 새로 들어오게 될 스피커들까지 처리하기 위해 인터페이스를 생성한다.

package Interfaces;

public interface Speakable {
	//public 은 반드시 연계
	
	public abstract void sound();

}

 

그 후 테스트를 위해 메인함수를 만들어 원하는 값을 출력해본다.

package Interfaces;

public class TvTest {

	public static void main(String[] args) {
		
		LgSpeak lgs = new LgSpeak();
		SmSpeak sms = new SmSpeak();
		AppleSpeak apps = new AppleSpeak();
		
		Tv t = new Tv(apps);
		
		t.speakSound();

	}

}

// 코딩을 할 때는 결합도가 낮도록 프로그래밍해야한다. → 인터페이스가 이 일을 해줌 → 이것이 다형성

→ 사용하는 쪽의 코드 수정을 최소화 할 수 있다.

여러 자식 공통적인 요소를 표현하고 싶은 게 상속

포함은 상속 외의 다!

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0415  (0) 2024.05.29
UIUX _국비과정 0412 [학생성적관리 시스템 및 첫 조별과제]  (0) 2024.05.29
UIUX _국비과정 0409  (0) 2024.05.29
UIUX _국비과정 0408  (0) 2024.05.29
UIUX _국비과정 0405  (0) 2024.05.29

작성 : 2024. 4. 9. 

 

들어가서 해보기

 

구름EDU - 모두를 위한 맞춤형 IT교육

구름EDU는 모두를 위한 맞춤형 IT교육 플랫폼입니다. 개인/학교/기업 및 기관 별 최적화된 IT교육 솔루션을 경험해보세요. 기초부터 실무 프로그래밍 교육, 전국 초중고/대학교 온라인 강의, 기업/

edu.goorm.io

 

지난 시간에는 상속에 대해 배웠습니다.

상속 과정에서 나타나는 특징에 대해 잘 알아야 함.

  • 오버라이딩

-부모로부터 상속받은 메서드를 그대로 사용하는 것이 아니라 내용을 바꿔 사용하는 것

// 상속
public class Tvs { // 부모 클래스
	// 두 개 이상의 자식

	String color; // 색상
	boolean power;  // 전원
	int channel;  // 채널

	public void power() {
		power = !power;
	}

	public void channelUp() {
		channel++;
	}

	public void channelDown() {
		channel--;
	}

}
// 상속
public class TvCaption extends Tvs { // 자식 클래스
// Caption 은 자막처리 
	
	boolean caption;
	
	void displayCaption(String text) {
		if (caption) {
			System.out.println(text);
		}
	}
}
// 상속
public class Tv3D extends Tvs {  // 자식 클래스
// 클래스를 만들 때도 Superclass 에서 상속 가능
	boolean tv3d;

	void display3d() {
		if (tv3d) {
			System.out.println("3D 기능 활성화");
		}
	}
}
public class TvsTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		TvCaption ctv = new TvCaption();
		ctv.displayCaption("코리아 아이티");
		ctv.caption = true; // 캡션을 킨 상태에서 실행 가능!
		ctv.displayCaption("코리아 아이티");
		
		// 부모 Tvs로 부터 상속 받은 부분
		// 모든 클래스는 obiect 클래스를 상속받는다.
		ctv.channel = 10;
		System.out.println(ctv.channel);
		ctv.channelUp();
		System.out.println(ctv.channel);
		
		Tv3D tv3 = new Tv3D();
		tv3.display3d();
		tv3.tv3d = true;
		tv3.display3d();
		
		tv3.channel = 20;
		System.out.println(tv3.channel);
		tv3.channelDown();
		System.out.println(tv3.channel);

	}

}

지난 시간 배운 부분 마무리

 

  • 오버라이딩 개념과 예제 코드
package ex01;

public class Parent {
	//0409 
	// 부모클래스와 자식클래스 변수 이름이 같을 때
	
	int x;
	int y;

}
```java
package ex01;

public class Child extends Parent {
//	int x = 20;
//	
//	void varTest() {
//		System.out.println(x); // 나의 x 
//		System.out.println(this.x); // 나의 x 
//		System.out.println(super.x); // 부모의 x
		
		// this() 나 자신의 생성자 호출
		// super() 부모의 생성자 호출
		// 자식에서 부모의 기본 생성자 생략 가능하지만 오류가 발생하기도.
		// 하나 이상의 생성자 정의 필요
		// 부모의 생성자를 골라서 호출 할 수도 있음.
	
	int z;
	
//	Child() {
//		super();
//	}  // 기본 생성자 생략가능
}
```

 

  • 패키지

이름 지을 때 회사에서는 도메인을 사용 ( 예. com.naver.news )

이름은 무조건 소문자로! (약속)

 

circle 패키지

package circle;

public class Circle {
	
	public int radius; // 반지름
	public final double PI = 3.14;
	
	public Circle (int radius) {
		this.radius = radius;
	}
	
	public double getArea() {
		return radius * radius * PI;
	}
}

 

rectangle 패키지

package ractangle;

public class Ractangle {
	public int w;
	public int h;

	public Ractangle(int w, int h) {
		this.w = w;
		this.h = h;
	}

	public int getArea() {
		return w * h;
	}

}

 

circle 패키지와 ractangle 패키지를 합쳐 동작시켜보자!

 

default 패키지에 작성된 메인함수

//0409

// 다른 패키지 가져오기
import circle.Circle;
import ractangle.Ractangle;

public class FigureAreaTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 같은 패키지가 아닐 때 사용 방법
		Circle c = new Circle(5);
		double circleArea = c.getArea();
		
		System.out.println("원의 넓이 : " + circleArea);
		
		Ractangle r = new Ractangle(10, 5);
		int ractangleArea = r.getArea();
		
		System.out.println("사각형의 넓이 : " + ractangleArea);
	}

}

 

  • 접근제어자 (접근제한자)
아무것도 안쓰여 있다면 default   상속받는다면 가능 -> protected
         private < (default < protected) < public
         해당클래스         동일패키지         모든패키지

클래스 : default, public

멤버 변수, 메서드, 생성자 : private, default, protected, public

생성자의 접근제어자는 클래스의 접근제어자와 동일

지역 변수 : 쓸 수 없다

 

private 한 생성자를 정의한 객체를 싱글톤 객체라고 함 : new 연산 불가

package circle2;

import circle.Circle;
// 원주율 구하기
public class CircleChild extends Circle {
	
	// 부모생성자 오버로딩 상태라면 생성자 반드시 추가
	public int angle;
	
	public CircleChild(int radius, int angle) {
		super(radius);
		this.angle = angle;
	}
	
	// 부모 것 그대로 쓰려면 오버라이딩(재정의)
	public double getArea() {
		return 2 * radius * PI * (angle/360.0);
	}
}
원주율 구하기도 추가!

//0409

// 다른 패키지 가져오기
import circle.Circle;
import circle2.CircleChild;
import ractangle.Ractangle;

public class FigureAreaTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 같은 패키지가 아닐 때 사용 방법
		Circle c = new Circle(5);
		double circleArea = c.getArea();
		c.setRadius(20);
		
		System.out.println("원의 넓이 : " + circleArea);
		
		Ractangle r = new Ractangle(10, 5);
		int ractangleArea = r.getArea();
		
		System.out.println("사각형의 넓이 : " + ractangleArea);
		
		CircleChild cc = new CircleChild(5, 30);
		double circlechildArea = cc.getArea();
		
		System.out.println("원주율 : " + cc.getArea());
		
	}

}

 

  • 상속구조에서 나타나는 특징 - 오버로딩, 슈퍼(부모), 패키지 분류와 접근제어자, protected(상속)

 

또, 아래의 것들이 있음

  • 다향성

객체 관계에서 나타나는 특징, 어떤 하나의 대상이 여러 방향으로 해석되어지는 것

***** 오버라이딩이 되었을 땐 오버라이딩을 따름.

  • 캡슐화
  • 인터페이스

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0412 [학생성적관리 시스템 및 첫 조별과제]  (0) 2024.05.29
UIUX _국비과정 0411  (0) 2024.05.29
UIUX _국비과정 0408  (0) 2024.05.29
UIUX _국비과정 0405  (0) 2024.05.29
UIUX _국비과정 0404  (0) 2024.05.29

작성 :  2024. 4. 8. 

 

자바 언어를 배우는 순서 및 목록

  1. 자바의 특징
  2. 코드 구조
  3. 변수와 자료형
  4. 구문규칙 및 주석
  5. 자료형 ( 숫자, 불, 문자, 문자열, StringBuffer, 배열, 리스트, 맵, 집합, 상수집합, 형변환과 final)
  6. 제어문
  7. 객체지향 - 클래스, 매서드, 호출
  8. 상속
  9. 생성자
  10. 인터페이스
  11. 다향성
  12. 추상클래스
  13. 입출력
  14. 패키지
  15. 접근 제어자
  16. 스태틱
  17. 예외처리
  18. 스레드
  19. 함수형 프로그래밍

지난 주 클래스까지 배움. 자료형을 다 다뤄보진 않아서 알고 넘어가는 게 필요할 것 같다.

미리 책을 살펴봤을 때 ‘다향성’ 부분이 이해가 잘 안되던데 수업에서는 어떻게 다룰지 잘 들어봐야겠다.

  • 매개 변수 - call by reference (참조형 (주소값)) : 클래스명, 배열
// 일단 클래스를 하나 만들기, 주소값을 사용하기 위해 참조할 주소가 되는 클래스 

public class Data {

// call by reference (참조형 (주소값)) : 클래스명, 배열
// 0408 수업
// 맴버변수 하나 저장

int x;
}

 

// call by reference (참조형 (주소값)) : 클래스명, 배열


	public class Function {

	// 클래스명의 변수를 썼다 -> 참조형, 배열 사용, 참조방식
	void change2(Data d) {
		d.x = 1000;
	}

	// 배열
	void arrChange(int[] arr) {

		arr[0] = 10;

	}
	
	
	
+ 메서드의 정의 방식 2가지

	// 인스턴스 메서드
	// 클래스 메서드
	
		void instanceMethod() {
		System.out.println("인스터스 메서드 호출");
	}
	
	static void staticMethod() {
		System.out.println("클래스 메서드 호출");
	}

}
// call by reference (참조형 (주소값)) : 클래스명, 배열


import java.util.Arrays;

public class FunctionTest {



		// 클래스 메서드는 생성 없이 사용할 수 있다
		// 공유의 개념!
		Function.staticMethod();  // 클래스 메서드 호출

		Function f = new Function();


		Data d = new Data();
		d.x = 10;

		f.change2(d);
		
		System.out.println(d.x);  // 1000
		
		int[] arr = {1, 2, 3, 4, 5};
		
		f.arrChange(arr);
		System.out.println(Arrays.toString(arr));  // [10, 2, 3, 4, 5]




		f.instanceMethod();  // 인스터스 메서드 호출
		f.staticMethod();  // 클래스 메서드 호출



}

 

public class Function2 {

	// 맴버변수와 메서드 간의 호출관계에 대해 알아보자

	int iv;
	static int cv;

	void instanceMethod1() {
		iv = 10;
		cv = 20;
	}

	void instanceMethod2() {
		instanceMethod1();
		staticMethod1(); // 호출가능

	}

	static void staticMethod1() {
		// iv = 30; // 생성 전에는 메모리 X, 객체를 생성하는 시점에 만들어짐.
		cv = 40; //static 한 메서드는 static 변수를 쓸 수 있다.
	
	}
	
	static void staticMethod2() {
		// instanceMethod1(); // 불가능
		staticMethod1(); // 가능
	
		// 인스턴스는 인스턴스끼리 할당시점이 같고
		// static 은 static 끼리 할당시점이 같다
	
	}
}

 

public class Function2 {

	// 맴버변수와 메서드 간의 호출관계에 대해 알아보자

	int iv;
	static int cv;

	void instanceMethod1() {
		iv = 10;
		cv = 20;
	}

	void instanceMethod2() {
		instanceMethod1();
		staticMethod1(); // 호출가능

	}

	static void staticMethod1() {
		// iv = 30; // 생성 전에는 메모리 X, 객체를 생성하는 시점에 만들어짐.
		cv = 40; //static 한 메서드는 static 변수를 쓸 수 있다.
	
	}
	
	static void staticMethod2() {
		// instanceMethod1(); // 불가능
		staticMethod1(); // 가능
	
		// 인스턴스는 인스턴스끼리 할당시점이 같고
		// static 은 static 끼리 할당시점이 같다
	
	}
}

 

public class Function3Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Function3 f3 = new Function3();
		
		
		int x = 10;
		int y = 20;
		
		System.out.println(f3.add(x,y));
		
		int[] arr = {1, 2, 3, 4, 5};
		
		//f3.add(arr);  // void 함수는 실행할 수 없음.
		                // return 받기 전까진 알 수 없음
		                // 실행하면 오류가 남.
		
		System.out.println(f3.add(arr));

	}

}

 

 

  • 가변인자

 

메서드를 호출하고자 할때 인수의 갯수가 가변적일 때 가변인수를 처리하면 손 쉽게 처리할 수 있다.

참조)

 

[Java]가변인자(varargs)을 왜 쓰는거지? 쉬운 이해와 활용

가변인자(varargs) ...String 0 .개요 가변인자는 메서드의 매개변수를 동적으로 처리할 수 있도록 해준다. 이를 사용하면 메서드 호출 시 전달되는 인자의 개수를 동적으로 변경할 수 있다. public void

hirodevelodiary.tistory.com

 

public class Function4 {
	// 가변인자를 받는 형태
	void varArgs(int... args) { // int ...args -> 배열 형식
		for (int num : args) {
			System.out.println(num);
		}
	}
}


// 수업이 끝나고 나면 목차 정리를 하고 구체적으로 정리해보새요. 

// 메소드에 대해 배운 것들! 
// 1. 기본형식 (4개)
// 2. return 특징
// 3. 오버로딩
// 4. 가변인자
// 5. call by value / call by reference

 

public class Function4Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Function4 f4 = new Function4();
		f4.varArgs(1, 2, 3, 4, 5);
		
		
		int[] arr = { 6, 7, 8, 9, 10 };
		f4.varArgs(arr);

	}

}

 

 

  • 생성자

기능과 속성

속성과 연결되어져서 값을 다룰 때 사용할 수 있는 개념!

public class Car {

	// 속성

	// 생성자 : **** 멤버변수의 초기화 ( 대상 : 인스턴스 변수 )
	// 클래스 변수는 생성자를 사용하지 않음
	// 클래스명과 대소문자 동일하게 작성된다
	// 메서드처럼 생겼지만 리턴 타입이 없다
	// 직접 호출해서 사용할 수 없다
	// 객체를 생성할때 1번만 호출 가능
	// 속성 밑에 작성
	// 생성자 오버로딩이 가능, 매개변수와 타입값을 다르게

	// 기능

	// 속성
	String color;
	String gearType;
	int door;

	// 생성자
	Car() {
		color = "red";
		gearType = "auto";
		door = 4;
	}

	// 생성자가 없어도 기본값이 설정되어 있어 값이 나옴 (null, 0 과 같은)

//	Car() {
//		
//	}  <- 역할이 없는 기본 생성자, 단독인 경우 생략이 가능하다!
// 무조건 생략 가능한 게 아니라 생성자 오버로딩 시 생략은 판단해야 한다.

	// 속성과 같게
	Car(String color) {
		this.color = color;  // 이름이 같을 경우, 구분을 위해 this. 붙이기
	}

	Car(String color, String gearType) {
		this.color = color;
		this.gearType = gearType;

	}

	Car(String color, String gearType, int door) {
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}

}
public class CarTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 객체 생성  생성자를 호출하는 부분! 
		Car c = new Car();
		System.out.println(c.color);
		System.out.println(c.gearType);
		System.out.println(c.door);
		
	}

}
public class Car {

	// 속성

	// 생성자 : **** 멤버변수의 초기화 ( 대상 : 인스턴스 변수 )
	// 클래스 변수는 생성자를 사용하지 않음
	// 클래스명과 대소문자 동일하게 작성된다
	// 메서드처럼 생겼지만 리턴 타입이 없다
	// 직접 호출해서 사용할 수 없다
	// 객체를 생성할때 1번만 호출 가능
	// 속성 밑에 작성
	// 생성자 오버로딩이 가능, 매개변수와 타입값을 다르게
	// 생성자 간 상호 호출 가능

	// 기능





	// 속성
	String color;
	String gearType;
	int door;

	// 생성자
//	Car() {
//		color = "red";
//		gearType = "auto";
//		door = 4;
//	}

	// 생성자가 없어도 기본값이 설정되어 있어 값이 나옴 (null, 0 과 같은)

	Car() {
		
		// 생성자 간 상호 호출 가능
		// this.color = "pink"; 이렇게 하는 것 X
		this("pink", "auto", 2);
		
	}  //<- 역할이 없는 기본 생성자, 단독인 경우 생략이 가능하다!
	// 무조건 생략 가능한 게 아니라 생성자 오버로딩 시 생략은 판단해야 한다.
	// 생성자간 호출 : this()
	// this() : 생성자의 가장 위쪽에 작성!
	

	// 속성과 같게
	Car(String color) {
		// this.color = color;  // 이름이 같을 경우, 구분을 위해 this. 붙이기
		this(color, "auto", 5);  // 생성자 간 상호 호출 가능
	}

	Car(String color, String gearType) {
		this.color = color;
		this.gearType = gearType;

	}

	Car(String color, String gearType, int door) {
		this.color = color;
		this.gearType = gearType;
		this.door = door;
	}

}

 

public class CarTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 객체 생성  생성자를 호출하는 부분! 
		Car c = new Car();
		System.out.println(c.color);
		System.out.println(c.gearType);
		System.out.println(c.door);
		
		Car c2 = new Car("red");
		System.out.println(c2.color);
		System.out.println(c2.gearType);
		System.out.println(c2.door);
		
		Car c3 = new Car("blue" , "auto");
		System.out.println(c3.color);
		System.out.println(c3.gearType);
		System.out.println(c3.door);
		
		Car c4 = new Car("black" , "auto", 4);
		System.out.println(c4.color);
		System.out.println(c4.gearType);
		System.out.println(c4.door);
		
		
	}

}

 

  • 초기화 순서 자동초기화 - 명시적 초기화 - 초기화 블럭 - 생성자 - 생성 후 초기화

  • 변수 생성자 메서드 - 클래스에서 작성되는 세 가지를 다 배웠습니다.

-개념과 코드를 같이 정리해서 공부하기

-개념을 적어두고 그 아래 코드를 써보며 공부

매개변수를 써라. 하면 못쓰겠다.

 

public class Student {
	
	
	// 내 풀이 (답이 정수로만 나왔다..) 
	// 속성
	// 생성자
	// 기능
	
	String name;
	int ban;
	int no;
	int kor;
	int eng;
	int math;
	
	int getTotal(int kor, int eng, int math) {
		return ( kor + eng + math );
	}
	
	int getAverage(int kor, int eng, int math) {
		return ( (kor + eng + math)/3 );
	}
	// int 가 아니라 float 를 쓰는 것이 조건.
	// 그렇게 하지 않았기 때문에 답이 정수로만 나옴
	
-----------------------------------------------------------------------------
	
	// 강사님 풀이 1)
	String name;
	int ban;
	int no;
	int kor;
	int eng;
	int math;
	
	int getTotal() {
		return kor + eng + math;
	}
	
	float getAverage() {
		return (int) (getTotal() / 3.0f * 10 + 0.5f) / 10f ;
	}
	
	
}


// 강사님 풀이 2)

String name;
	int ban;
	int no;
	int kor;
	int eng;
	int math;

	Student() {
		
	}
	
	Student(String name, int ban, int no, int kor, int eng, int math ) {
		this.name = name;
		this.ban = ban;
		this.no = no; 
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}
	
		// Source에 들어가서 자동 생성 가능
	  // 보통 위처럼 두 개의 생성자를 만들어 사용함
	

	int getTotal() {
		return kor + eng + math;
	}

	float getAverage() {
		return (int) (getTotal() / 3.0f * 10 + 0.5f) / 10f;
	}

}
public class StudentTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 내 풀이 
		Student S = new Student();
		
		int kor = 70;
		int eng = 12;
		int math = 97;
		
		System.out.println("총 점수의 합 : " + S.getTotal(kor, eng, math) + "점");		
		float f = S.getAverage(kor, eng, math);
		
		System.out.println("평균 점수 : " + f + "점");
		

-----------------------------------------------------------------------------

		// 강사님 풀이
		
		Student s = new Student();
		s.name = "yuna";
		System.out.println(s.name);
		
		Student s2 = new Student("yuna", 1, 1, 62, 85, 100);
		int total = s2.getTotal();
		float avg = s2.getAverage();
		
		System.out.printf("총점 : %d\n평균 : %f" , total , avg);
	
		}

}

배우는 내용이 너무 많아서 언제 이걸 꺼내 사용해야 하는 건지 감이 안잡힌다..

 

  • 롬북사용
// 자동으로 생성자 만드는 법

import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor


이제 여러 개의 클래스를 만들고 그 안에서 관계성을 가지고 작업해 볼 예정.

 (부모) class —— 관계 맺음——  (자식) class

      변수 3개   — 상속 ———> 변수 원래 2개 + 상속 3개 = 총 5개 사용 가능 

        생성자              생성자 

   메서드 3개    — 상속 ———> 메서드 원래 2개 + 상속 3개 = 총 5개 사용 가능

최소 2명 이상의 자식이 있을 때 ‘상속’이라는 개념 사용

부모가 변수가 3개 있다고 한 자식한테 3개를 준다고 부모 클래스가 사라지는 것이 아님.

똑같이 여러 자식 클래스에게 상속할 수 있음 (코드의 재사용성)

-공통요소를 부모 클래스에 정의 → 똑같이 자식에게 물려줌

-왜 이렇게 해야하나? → 동일한 코드를 반복적으로 정의하는 것을 막기 위해. 코드를 관리할 때 유리해짐.

부모클래스 - 추상화 클래스 ( 변수와 메서드를 상속하는 클래스)

// 상속하는 법
public class Parent {
	
	// 상속 
	// 두개 이상의 클래스와 부모와 자식을 개념으로 관계를 맺는 것
	// 상속의 대상은 변수와 메서드이다.
	// 단일 상속만 가능하다.
	// 상속에 상속은 가능하다 (다중 상속)
	
	
	int age;
	
	void add(int x, int y) {
		System.out.println(x + y);
	}

}
// 상속받는 법
public class Child extends Parent {

}
public class InheritanceTest {

	public static void main(String[] args) {
	
	Child c = new Child();
	c.age = 10;
	
	System.out.println(c.age);
	
	}
}

 

// 상속
public class Tvs {

	String color;
	boolean power;
	int channel;

	public void power() {
		power = !power;
	}

	public void channelUp() {
		channel++;
	}

	public void channelDown() {
		channel--;
	}

}
// 상속
public class TvCaption extends Tvs {

}
public class Tv3D extends Tvs {

	// 클래스를 만들 때도 Superclass 에서 상속 가능
}

여기까지 배운 시점에서 전의 내용을 내가 확실하게 알지 않으면 더 이상 따라가기 힘들 것이라고 판단,

생활 코딩을 보며 부족한 개념을 보충하기로 한다.

부족했던 개념 :

상수의 데이터 타입)

 

상수의 데이터 타입 - 생활코딩

상수 변수는 변하는 값을 의미한다. 그 대척점에 있는 것이 상수인데, 상수(常數, constant)란 변하지 않는 값을 의미한다. 아래의 코드 중에서 a는 변수이고, 1은 상수이다. int a = 1; 변수 a는 대입

www.opentutorials.org

 

자바에서 데이터 타입이 정수인 상수는 int, 실수형 상수는 double의 데이터 타입.

float 형 변수를 사용할 때는?

-float 형이라는 것을 명시해주면 됨.

float a = 2.2F;
            --- F는 이 기호 앞의 숫자가 float 데이터 타입이라는 것을 명시적으로 표현하는 방법이다.
 

자습 시간 반복문까지 읽고 있었음

→ 반복문부터는 실습하며 다시 읽어볼 것!

 

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0411  (0) 2024.05.29
UIUX _국비과정 0409  (0) 2024.05.29
UIUX _국비과정 0405  (0) 2024.05.29
UIUX _국비과정 0404  (0) 2024.05.29
UIUX _국비과정 0403  (0) 2024.05.29

작성 : 2024. 4. 6. 13:56

  • obsidian 사용법 알아보기

지난 시간동안 기본 문법을 다 배웠습니다. 앞으로는 예제를 수정하며 더 공부해보세요.

오늘은 클래스에 대해 배웁니다.

오늘 배운 내용이 자바에서 제일 중요한 내용!

  • 클래스

클래스(class) 란 객체를 정의하기 위한 틀, 설계도

이런 클래스를 가지고 여러 객체를 생성하여 사용.

중요한 키워드 : 관계! 클래스와 객체 사이 관계성을 가지고 프로그램이 동작함.

클래스 - 메인함수를 사용한 것 + 메인함수 사용 X = 같이 하나의 동작을 하게 됨

→ 원리

자바 = OOP (Object-Oriented Programming) = 객체지향프로그램

객체 : 유형, 무형의 사물들 , 현실에 존재하는 모든 것들을 코드화 할 수 있다..

// 클래스 함수에 들어가는 것들

public class Person {

 속성 : 눈, 코, 입, 팔, 다리, 머리카락, 이름, 나이, 주소, 신분 ...
 속성 - 문법적 형식으로 '변수' 사용
 
 게임의 캐릭터를 생각해보면 됨
 
 움직임을 표현할 수 있는 속성, 아닌 속성이 있음. 움직임을 표현하는 속성으로 나타낼 수 있는 것이 기능!
 기능 : 눈 깜박이기, 숨쉬기, 달리기 ...
 기능 - 문법적 특성 '메서드' 사용
 필요한 속성과 기능을 잘 골라내서 사용하기


 클래스 - '설계도'라고 함.
 어떤 것을 표현한 형태!
 인스턴스화
 
}

 

 

public class Tv {

// Tv에 대한 설계도 

// 티비의 속성 :
// 색상
String color;
// 전원버튼 (토글 형태 - boolean 을 씀)
boolean power;
// 채널
int channel;

// 속성들 중에 기능(변화가 생길 수 있는지)을 할 수 있는지 판단하고 기능을 메서드로 만들어줘야 함.
// Tv에서 기능 : 전원버튼, 채널

// 메서드 사용 예시
// 변수이름과 메서드는 형식으로 구분할 수 있어서 이름이 같아도 상관 없음.

// 전원
void power() {
	power = !power;
}

// 채널 버튼 올리고 내리고 두 개.
void channelUp() {
	channel++;
}

void channelDown() {
	channel--;
}

  // 이렇게 하면 Tv 에 대한 설계가 끝났다.
	// 여기까지 하면 정의만 한 것, 어떤 일도 일어나지 않음 
	// '객체의 생성'을 한 것! = 인스턴스화
	
}

 

public class TvTest {

public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 객체를 가지고 와서 실제로 동작시키는 역할을 함.
		
		// 객체를 생성 (메모리 로딩 - Tv 클래스에 있는 변수 3개와 메서드 3개 총 6개 할당)
		// 프로그램은 변수와 메서드를 사용하기 위해 메모리에 할당하는 역할을 하는 것!
		// 메모리를 할당하면 주소값을 가지게 됨.
		// new Tv(); // Tv를 만들었다 - 객체 생성
		// new __(); <- 주소값 
		// 이 주소값에 접근 하는 방법 new __() . <- 이 점을 통해 접근한다 ;
		// 예시 ) new Tv().channel;
		// 위와 같이 하면 일회성만 사용할 수 있음
		
		Tv t = new Tv(); // 객체 생성
		// t는 주소값을 가짐. t로 변수에 접근. 참조형 변수 -> 대문 주소만 알면 방은 다 접근할 수 있다
		// 해당클래스 이름이 타입이 됨. 
		// 클래스를 만들면 클래스 자체가 참조형을 만들 수 있는 타입이 됨. 
		
		t.color = "red"; // 맴버변수의 초기화 (초기화가 값을 설정해준다는 의미)
		t.power = true; 
		t.channel = 10; 
		
		System.out.println(t.channel);
		
		t.channelUp();  // 메서드의 호출 - 안에 있는 기능을 사용하겠다
		
		System.out.println(t.channel);  // 매서드가 작동됨! 객체를 정의하고 나서 안의 멤버를 생성해 할당, 변수나 메서드를 참조해 접근
		// 메서드 호출을 통해 사용하면 '동작'을 하게 됨.
		
		//-------------------------------------------------------------------------
		
		// Tv 설계도(클래스)가 있으니 똑같은 것을 여러 개 만들 수 있음
		
		Tv t2 = new Tv();
		// t 와 t2 는 다른 객체, 주소값이 다름 
		// 객체는 생성될 때마다 메모리에 값을 할당. 매번 새로운 객제가 만들어지는 것.
		
		t2.color = "blue";
		
		System.out.println(t2.color);
		// t2.color 가 변수명이 되는 것
		
		System.out.println(t.color);
		
		t2 = t; 
		// 이렇게 되면 t2 의 참조가 끊김 -> 자바 내부에서  G.C 실행, 오버플로우를 막기 위해.
		// 자바는 G.C가 하나 있기 때문에 이렇게 참조가 끊길 경우 실행이 오래 걸리게 됨. 
		// 웹은 해당 사항이 없지만 자바를 쓰기 때문에 G.C에 대해 알아보기.
		
		t2.color = "black";
		// t가 가리키는 것의 색이 바뀐 것.
		
		System.out.println(t.color);
		System.out.println(t2.color);
		// t가 할당받았던 곳의 주소값을 t2가 같이 참조한다는 것을 알 수 있음.
		
		System.out.println(t);  // 이렇게 하면 주소값을 알 수 있음. 
		System.out.println(t2); // t와 똑같은 주소값.
	}

}

 

 

  • 객체배열
public class Time {
// 객체배열

// 시계의 속성 : 시, 분, 초

// 시
private int hour; // 표현 가능 범위 : 0 ~ 23 객체를 구성할때 범위 이상 사용 못하도록 제어
// 분
private int minute; // 0 ~ 59
// 초
private float second; // 0 ~ 59

// private -> 제어
// private 때문에 접근 불가능힌 것을
// Gatter(읽기) / Satter(쓰기) 로 만들어 처리.
// Gatter / Satter 만들기

// 반드시 public 붙이고 대문자
public int getHour() {
	return hour;
}

// 반드시 public 붙이고 대문자 (변수명)
// 변수를 넣어줄 때 선언
public void setHour(int hour) {

	// 이 조건에 포함되지 않으면
	if (!(hour >= 0 && hour <= 23)) {
		return;
	}

	// 실행 X
	this.hour = hour;
}

public int getMinute() {
	return minute;
}

public void setMinute(int minute) {

	if (!(minute >= 0 && minute <= 59)) {
		System.out.println("범위를 벗어난 값입니다.");
		return;
	}

	this.minute = minute;
}

public float getSecond() {
	return second;
}

public void setSecond(float second) {

	if (!(second >= 0 && second <= 59)) {
		System.out.println("범위를 벗어난 값입니다.");
		return;
	}

	this.second = second;
}

(앞으로 더 자세히 배울 예정)

private → 접근 제한자

 

  • 접근 제한자

public : 제한 없이 모든 패키지, 모든 클래스에서 가능

protected : 같은 패키지 안에서 사용 가능, 다른 패키지라도 자식 클래스라면 접근가능

default : 같은 패키지 내에서만 접근 가능

private : 같은 클래스 내에서만 접근 가능

접근 범위가 넓은 쪽에서 좁은 쪽

public < protected < default < private

 

public class TimeTest {
	
	// 생성을 위한 메인함수
	public static void main(String[] args) {
		// TODO Auto-generated method stub

//		Time t1, t2, t3; 
//		// 동일한 타입의 변수가 세 개를 사용할 때는 위와 같은 형태보다 배열을 사용하는 것이 효과적! 
//		
//		t1 = new Time();
//		t2 = new Time();
//		t3 = new Time();
		
//		t1.hour = 12;
//		t1.minute = 10;
//		t1.second = 34;
//		
//		t2.hour = 6;
//		t2.minute = 30;
//		t2.second = 54;
//		
//		t3.hour = 3;
//		t3.minute = 23;
//		t3.second = 45;

		
		// 객체의 배열
		// 배열은 인덱스 번호 포함된 것까지가 변수 
		Time[] t = new Time[3];
		
		t[0] = new Time();
		t[1] = new Time();
		t[2] = new Time();
		
		t[0].setHour(12);
		t[0].setMinute(56);
		t[0].setSecond(22);
		System.out.println(t[0].getHour());
		System.out.println(t[0].getMinute());
		System.out.println(t[0].getSecond());
		// 가로 안의 값이 Time 클래스로 넘어감.
		
//		t[0].hour = 12;
//		t[0].minute = 10;
//		t[0].second = 34;
//		
//		t[1].hour = 1;
//		t[1].minute = 11;
//		t[1].second = 34;
//		
//		t[2].hour = 2;
//		t[2].minute = 9;
//		t[2].second = 19;
//		
//		t[3].hour = 7;
//		t[3].minute = 27;
//		t[3].second = 36;
		
		
	}

}

 

수월한 getter, setter 생성을 위해 lombok 이라는 라이브러리를 추천.

lombok 설치 (완.)

  • lombok 이용 방법 알아보기
  • 공식사이트 가서 알아보기
  • 자바에서 클래스를 사용한다는 것은 메모리값을 활용하는 것.

 

public class Card {

// 맴버 변수 (class) 에는
// 자동초기화
// 인스턴스 변수, - 반드시 생성 후에 사용
// 클래스 변수 두 가지가 있다.
// 클래스 변수 - 1. 생성없이 사용 가능 (앞에 static를 붙임.)
//            2. 변수가 공유 된다.


int iv; // 인스턴스 변수
static int cv; // 클래스 변수

// 클래스 영역에는 for문을 쓸 수 없다.
// 클래스 안에 다른 형태의 블록을 만들어서 for문, if문 등 사용 -> 메서드
// 메서드를 만들고 그 안에 코드를 넣어 사용
// 모든 영역을 메서드로 구성해 동작 -> 자바

// 트럼프카드 (서양카드)

// 카드의 속성 : 숫자, 모양(무늬), 색, 조커유무, 영어알파벳(A), 크기 등등
// 인스턴스 변수
String kind; // 무늬
int number; // 숫자
static int width = 100; // 폭
static int height = 200; // 높이
// 폭과 높이는 클래스 변수로,, 고정된 값이기 때문에!

}
public class CardTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		// 클래스를 구성하는 요소 - 변수와 메서드!
		
//		System.out.println(Card.cv);
//		//                 소속클래스명 = 이 자체가 생성을 의미한다.
//		
//		Card c = new Card();
//		System.out.println(c.iv);
//		System.out.println(c.cv);
		
		Card c1 = new Card();
		Card c2 = new Card();
		
		c1.kind = "Hart";
		c1.number = 10;
		
		c2.kind = "space";
		c2.number = 20;
		
		System.out.println(c1.kind + " : " + c1.number); // 결과 : Hart : 10
		System.out.println(c1.width); // 결과 : 100
		System.out.println(c2.height); // 결과 : 200
		System.out.println(c2.kind + " : " + c2.number); // 결과 : space : 20

		c1.iv = 10;
		c2.iv = 20;

		System.out.println(c1.iv); // 결과 : 10
		System.out.println(c2.iv); // 결과 : 20

		// 각각의 독립된 변수

		c1.cv = 30;

		System.out.println(c1.cv);  // 결과 : 30 
		System.out.println(c2.cv);  // 결과 : 30

		c2.cv = 100;

		System.out.println(c1.cv);  // 결과 : 100
		System.out.println(c2.cv);  // 결과 : 100
		// 변수는 공유되어진다는 것을 알 수 있음

	}

}

 

public class Function {
	// 클래스는 변수와 메서드만 작성
	// 메서드에 대해 알아봅니다.
	// 메세지 교환 방식

	// 메서드 힙 영역에서 한번만 할당
	// 메서드는 데이터를 주고 받음.

	// 리턴타입 메서드명([매개변수]) { <- [ ] 표시 - 어떤 경우에는 쓰고 어떤 경우에는 안쓰는 것을 판단해서 써야함.
	// 실행문;
	// [return;] <- 리턴타입이 void 의 경우 생략한다.
	// }

	// 함수 정의 - 속성을 이용해 기능 표현

	// 리턴타입 : 기본형, 참조형, void (세 가지 중 하나 사용)

	// 매개변수 사용 X
	void add() {
		System.out.println(2 + 3);
	}

	// 매개변수 사용
	// 매개변수는 지역변수
	void add2(int x, int y) { // x = 10 , y = 20
		System.out.println(x + y);
	}

	void add3(int x, int y) {
		int sum = x + y;
	}

	// 돌려받으려는 값의 타입 적어줘야함.
	int add4(int x, int y) {
		int sum = x + y;
		return sum; // 확인하는 역할의 return
	}

	// return 구문을 쓸 때 특징
	// 꼭 값을 돌려줄 때 쓰는 게 아님!

	void add5(int x) {
		if (x >= 10) {
			System.out.println("return문에 의한 종료");
			return; // 메서드 강제종료 = 조건이 맞으면 종료한다.
			// void 타입에서는 return을 쓸 수 없지만 조건문의 강제종료를 위해 사용가능
		}

		System.out.println(x); // 위 조건에 만족하지 않으면 해당 코드가 실행됨.
	}

	int add6(int x, int y) {
//		if (x > y) {
//			return x;  // 반대조건에 대해서도 리턴해줘야 함.
//		} else {
//			return y;
//		}

		// 위 코드와 같은 의미

		if (x > y) {
			return x;
		}
		
		return y; // 간략한 표현
	}
	
	// 매개변수의 타입에 따른 분류
	// call by value (기본형) : 값의 복사
	// call by reference (참조형 (주소값)) : 클래스명, 배열
	
	
	// ' call by value (기본형) : 값의 복사 ' 를 사용한 매개변수 사용
	void add(int x, int y) {
		
		System.out.println(x);
		System.out.println(y);
		
		x = 100;
		y = 200;
		
		System.out.println(x + y);
	}
	
	// ' call by reference (참조형 (주소값)) '
	// 다음 시간에..

}
public class FunctionTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// Function 클래스 생성

		Function f = new Function();

		// 함수를 사용하는 방법
		f.add(); // = 메소드의 호출
		f.add2(10, 20);
		f.add3(100, 200);
		// f.add4(5, 6); **** class에 있는 return으로 돌려받는 값이 됨.
		System.out.println(f.add4(5, 6));
		// Function 클래스에 있는 sum 과는 다른 sum
		int sum = f.add4(9, 8);
		System.out.println(sum);

		f.add5(3);
		f.add5(11);
		int max = f.add6(10, 50);
		System.out.println(max);
		
		
		// Function 클래스의 x, y와는 다른 값
		int	x = 10;
		int y = 20;
		
		f.add(x, y);
		
		System.out.println(x);
		System.out.println(y);
	}

}

'2024_UIUX 국비 TIL' 카테고리의 다른 글

UIUX _국비과정 0409  (0) 2024.05.29
UIUX _국비과정 0408  (0) 2024.05.29
UIUX _국비과정 0404  (0) 2024.05.29
UIUX _국비과정 0403  (0) 2024.05.29
UIUX _국비과정 0402  (0) 2024.05.29

+ Recent posts