index.jsp

모든 웹사이트의 기본이 되는 첫 시작페이지는 index페이지라고 한다.

네이버에서도 www.naver.com/index.html 에 실제로 접속한 것이라고 볼 수 있다.

 

1. index.jsp에서 로그인 화면으로 이동해라라는 구문을 작성

-location.href = 'login'.jsp; 를 작성 후 실행

-http 404 메시지 나옴(아직 옮겨갈 페이지 login.jsp가 없다는 의미)

-일단 최근에 많이 쓰이는 인코딩언어를 UTF-8로 바꾼다.

 

*link를 간단하게 설명하면 말 그대로 '외부에 있는 문서를 연결해준다.' 라는 뜻

*<link rel="stylesheet"> 스타일 시트로 css파일을 불러오기 위한 연결설정

 

2. loin.jsp 파일을 만든다.

-index.jsp 안에 기본구문을 같게 한다.

-로그인 디자인부터 만든다.

 

*부트스트랩은 bootstrap-3.3.7버전으로 다운 받았다.

압축풀기 및 폴더를 WEB CONTENT 안으로 폴더를 옮긴다.

 

*부트스트랩은 컴퓨터/핸드폰 등 어느 것으로 접속을 해도 해상도에 맞게 알아서

디자인이 환경에 맞게 변경된다. 그래서 하기처럼 meta구문작성

 

-반응형 웹에 사용 되는 메타택 즉 <meta>구문 추가

 

 

3. 애니메이션을 담당할 자바스크립트를 작성한다.

-제이쿼리를 특정 홈페이지에서 가져오도록 작성한다.

(jquery를 특정 홈페이지에서 가져오고 자바스크립트 참조하겠다는 구문작성)

 

-부트스트랩 안에 자바스크립트파일을 참조하겠다라고 작성을 한다.

(stylesheet를 참조 및 css안에 bootstrap.css를 참조하겠다는 구문 작성)

 

자바스크립트 및 부트스트랩 참조 구문 사진출력

 

4. 네비게이션 구성 및 버튼 구성

nav bar default 클래스를 작성한다. 하나의 웹사이트에 전반적인 구성을 보여 주는 개념이다. 그리고 홈페이지에 로고를 담는 영역 header구문에 속하는 버튼영역구문을 작성한다.

 

 

헤드 버튼영역구문 코드 사진

 

화면을 줄이면 아이콘 세 개 적용한 메뉴바 출력

 

5. 탑메뉴에 최신이야기 및 커뮤니티추천 그리고 우측상단버튼에 접속하기만 있도록 할 것

   접속하기 버튼에 로그인 및 회원가입 버튼 있도록 설정하기

 

탑메뉴 및 접속하기 버튼 코드변경

#바꿔본 것

다음과 같이 화면이 안줄어들어도 우측상단 버튼이 보이도록 코드를 수정했다.

 

홈화면출력

 

6. 로그인 페이지 작성

-로그인화면

-아이디/비밀번호 폼

-로그인버튼(submit버튼)

-로그인 아이디/비번 입력란

 

 

로그인버튼을 누르면 아직 내용이 없기 때문에 다음과 같은 화면이 나온다. 입력후 loginAction페이지 까지 확인

 

 

'신입개발자로 취업하기까지 > JSP게시판' 카테고리의 다른 글

6. 회원가입기능 구축  (0) 2020.08.19
5. 로그인 화면  (0) 2020.08.19
4. 로그인 기능 구현하기  (0) 2020.08.19
3. 회원 데이터베이스 구축  (0) 2020.08.19
20200707 1.환경설정  (0) 2020.07.08

JSP 게시판 프로젝트를 위한 환경설정

 

JSP란

-Java Server Page

<위키백과 참조>

자바 서버 페이지는 HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어이다. Java EE 스펙 중 일부로 웹 애플리케이션 서버에서 동작한다.

 

1. JDK 설치

-다운로드 및 설치

 

-자바프로그램 작동을 위해서 환경변수 설정

-운영체제에 맞는 윈도우64bit jdk 다운로드(미리 다운로드)

-자바로 작성된 jsp를 작동할 수 있는 jsp용 웹서버인 tomcat 설치를 한다.

 

2. tomcat설치 및 구동

-tomcat 다운로드 및 압축풀기

 

-tomcat 수동으로 구동 

*설치된 tomcat안에 bin 폴더안에 restart 배치파일(startup)

cmd에서 해당경로에서 startup.bat 명령어를 엔터후 실행시킴으로

 

localhost로 웹서버 작동확인

사진

 

일일이 구동하기 힘드니 웹사이트개발환경

즉 전반적인 것을 관리하는 통합개발환경 이클립스를 설치한다.

 

3. 이클립스 설치(미리다운로드함)

-이클립스 다운로드

-Java EE로 설치

*자바 EE는 자바 SE 플랫폼을 기반으로 되어 있다. 

 자바 EE에서 대규모, 다계층, 확장성, 신뢰성, 보안 네트워킹 어플리케이션의 개발과 실행을 위한 API 그리고 환경을 제 

 공한다.

 

4. 프로젝트(Dynamic web project) 생성 및 tomcat 연동

-new->Dynamic web project 클릭

-New runtime에서 tomcat 버전 설정 및 tomcat설치된 경로 설정

 

 

5. web content

-다양한 웹페이지 저장/브라우저를 통해 페이지에 접속해서 내용을 볼 수 있다.

-new -> index.jsp 파일을 만든다.

 

-index.jsp파일을 구동한다. (finish클릭)

-hello world 출력

 

기본환경설정 완료

1. 회원 기능 테스트

 

테스트 내용

-회원가입기능이 작동해야 한다.

-회원가입할 때 같은 이름이 있으면 예외가 발생해야 한다.

 

테스트케이스

1.MemberService 클래스에서

a.하기 MemberService에서 ctrl + shift + t < create test < ok를 한다.

 

public MemberService {

......

}

 

b. public void 회원가입( ) throws Exception{

//given(이렇게 주어졌을 때)

 

//when(이렇게 하면)

 

//then(이렇게 된다)

}

 

public void 회원_중복_예외() throws Exception{

//given

 

//when

 

//then

}

 

 

테스트 범위

-정말 순수한 단위테스트 보다 jpa가 메모리모드로 실제 디비까지 돌아가는 것을 보기 위해

 완전히 스프링과 integration해서 테스트를 할 것이다.

 

그래서 하기 두가지를 세팅할 것이다.

 

@RunWith(SpringRunner.class)

@SpringBootTest

@Transactional 데이터를 변경해야 하기 때문에 하는 설정,

public class MemberServiceTest {

 

//테스트라 참조해서 테스트할 것이 없기 때문에 하기처럼 작성

@Autowired MemberService memberService;

@Autowired MemberRepository memberRepository;

}

////alt + enter를 누르고 suppress인가를 누르니 memberRepository가 보라색으로 변경됨

 

*@Transanctional

-데이터를 변경해야 하기 때문에 하는 설정

-같은 Transaction안에서 같은 엔티티에서 id(pk)이 같으면 같은 영속성 컨텍스트에서

 똑같은 값이 관리가 된다.

-Transactional이 있어야 롤백이 가능하다.

-insert SQLDB에 날라가지 않는다. 영속성 컨텍스트가 flush가 되지 않는다.

 

참고: 테스트 케이스 작성

Given, When, Then (http://martinfowler.com/bliki/GivenWhenThen.html) >

필수는 아니지만 위에 것을 기본으로 해서 다양하게 응용하는 것을 권장한다고 한다.

 

 

*축약어를 통해 코드구문생성하기

설정경로

- File->Setting->Editer->Live Templates -> tdd 단축단어 생성 -> tdd

 

내용설정

@Test

public void () throws Exception {

//given

 

//when

 

//then

}

 

=> tdd를 사용하면 위에 구문이 자동생성된다.

 

 

@Rollback(false)

-Transacntional을 롤백이 기본적으로 되므로 직접 눈으로 확인하고 싶고

 DB에 값이 들어가는 것을 확인하고 싶을 때에는

 @Rollback(false)public void 회원가입() throws Exception 에 적용하자.

 

-데이터베이스 트랜잭션이 커밋을 하는 순간 flush가 되면서

  jpa 영속성 컨텍스트가 있는 member객체가 insert문이 만들어지면서 DB insert가 나가게 된다.

 

사진

 

em.flush();

assertEquals(member, memberRepository.findOne(savedId));

-insert문이 db로 가는 것을 실행시킬 때 눈으로 볼 수 있고,

 transactionrollback 되도록 하는 설정

 

try catch return

-중복회원 및 회원가입을 다시 테스트

*데이터베이스에 앞서 insertDB로 날려 값(PRIMARY KEY)이 생성 되었다면

 실행시 중복회원에서 에러가 발생하니 조심할 것

 

사진

회원 기능 테스트 완료

 

 

 

 

2. 회원기능테스트 기술적 정리

a.RunWith(SpringRunner.class)

-jUnit 실행할 때 스프링이랑 엮어서 실행을 하겠다.

 

@SpringBootTest

-스프링부트위에서 테스트를 하려면 꼭 필요하다.

-@Autowired 실행이 실패한다.

-컨테이너 안에서 테스트를 한다.

 

b.@Transactional

-테스트가 끝나면 Rollback을 한다.

-서비스클래스나 레포지터리에 붙여서 돌리면 Rollback하지 않는다.

 

c. tdd 단축키 만들어서 테스트구문 생성하기

 

d. 테스트를 완전 격리된 환경에서 하는 방법

-실제 외부에 있는 데이터베이스를 사용했다.

-디비를 외부에 설치해서 테스트해야 할 경우가 생긴다. 테스트가 끝나고

 데이터가 초기화 되는 것이 좋다.

-테스트를 완전 격리된 환경에서 하는 방법이 있다.

-자바안에 데이터베이스를 만들어 테스트 하는 방법이 있는데,

 메모리 데이터베이스를 사용하는 방법이다. 안에 않고 가상의 데이터베이스를 만들어서

 스프링부트를 사용하면 이러한 방법을 무료로 이용할 수 있다.

 

 

종류

1. main

- 실제 개발하는 운영소스 (java, resouces)

-기본적으로 운영로직은 java, resources가 운영권을 가진다.

 

2. test

-테스트하는 운영소스 (java, resources:directory resources생성해주어야 함)

-테스트 운영로직의 우선권은 test안에 java, resources가 우선권을 가진다.

-application.yml을 java->resource로부터 가져온다면 application.yml이 우선권을 가져

 main에 있는 application.yml은 무시되고 test안에 있는 application.yml이 실행된다.

 

(application.yml 복사 test->resources(directory)->application.yml(복사 from main:java)

 

 

 

JVM내에서 실행 및 메모리모드로 데이터베이스실행 테스트

-jvm 안에서 실행되고 memory모드로 데이터베이스를 띄워주기 위해

 application.ymlspingurl을 인메모리 url로 바꾸어 준다.

 

주소는 h2.database->cheat sheet->In-Memory->첫번째 라인

 

사진 h2.database 사이트

 

사진

 

*하지만, spring, jpa 설정 내용이 전혀 없고 logging,level 설정 내용만으로도

 스프링부트의 기능으로 인해 인메모리 모드로 실행이 된다.

 극단적으로 얘기해서 내용이 전혀 없어도 인메모리 모드로 실행이 된다.

주문도메인개발

 

주문도메인이 제일 중요!

-비즈니스로직들이 얽혀서 돌아가는 것을 jpa나 엔티티를 가지고 어떻게 풀어내는지 알 수 있다.

-트랜잭션 스크립트 패턴과 도메인모델패턴을 코드를 통해 이해 할 수 있다.

 

1.주문 도메인 개발

구현 기능

-상품 주문

-주문 내역 조회

-주문 취소

 

순서

-주문 엔티티, 주문상품 엔티티 개발 (핵심비즈니스로직)

-주문 리포지토리 개발

-주문 서비스 개발

-주문 검색 기능 개발

-주문 기능 테스트

 

주문,주문상품 엔티티 개발

1. 주문클래스에서 생성메서드 생성

 

설명

-Order가 연관관계를 걸면서 세팅이 되고, 상태랑 주문시간 정보까지 정리가 되어서 세팅이 된다.

 

중요!

앞으로 무언가 생성하는 시점을 변경해야 하면 다른데서가 아닌 이곳에서만 바꾸면 되기 때문에 이렇게 작성하는 것이 중요하다.

 

실습사진

 

2.주문클래스에서 비즈니스로직 주문취소 작성

설명

a.완료된 배송은 취소 불가

 

b.주문하고 난 뒤에 취소

-주문한 상품이 2개이면 취소시 2개 각각 취소를 시켜주어야 한다.

 OrderItem에 취소구문작성해주어야 함.

 

c. OrderItem클래스에서 취소구문작성

-주문취소로 인해 orderItem에도 비즈니스 로직이 생겼다.

-취소하게 됨으로써 주문하기전에 기존 수량으로 다시 올라간다.

 

d. 조회로직(주문상품 전체 가격조회)

-주문총가격은 주문가격 및 수량으로 계산이 되어야 한다.

 

조회로직 간소화하는 방법

1. for지점에서 alt + enter -> sum,

2. inttotalprice에서 ctrl + alt +n 사용 stream로 변경)

3. 최종정리

 

실습사진

 

e.조회로직의 OrderItemgetTotalPricealt + enter이용하여 OrderItem getTotalPrice메서드 생성

-주문총가격은 주문가격 및 수량으로 계산되어야함을 염두에 두고 작성한다.

 

사진

 

f. 주문이 생성될때에 생성되는 OrderItem에 대한 생성메서드를 OrderItem클래스에서 작성

-Order클래스에서 작성된 생성메서드 createOrder에서 받아오는 orderItem 정보를 위해 생성메서드를 작성함

-주문이 생성되기 전에 기존에 남아있는 수량에서 OrderItem에서 주문한 수량만큼 수량이

 내려가고 order클래스에서 createOrder(신규주문생성)으로 정보가 넘어가게 된다.

*단순히 비즈니스적인 면에서 코드를 작성을 할 때에 위에처럼 그렇게 되어야 논리상 말이 맞.

 실제로는 OrderItem이 넘어 올 때 파라미터나 DTO를 이용하여 복잡하게 구성될 것 같다.

 

사진

기능 설명정리

생성메서드

밖에서 새로운 Order를 받아와서 set하는 방식이 아닌

주문이 들어오는 시작점부터 createOrder를 호출해서

Order클래스 안에서 Order에 대한 비즈니스로직을 완료한다.

주문생성과 관련된 문제가 있을 때 이곳을 확인하면 된다.

 

주문취소

취소불가

-이미 배송완료된 상품 취소는 불가하다는 비즈니스로직에 대한 체크로직이 엔티티 안에 있다.

 

취소

-취소 될시에 해당 아이템취소 수량만큼 수량이 다시 늘어나게 된다.

 

조회로직

전체주문가격조회

-주문가격과 주문수량을 곱하기 해서 최종 주문가격이 조회가 된다.

 

 

문제상황

 

1.RealMember 클래스이름을 다시 기억하기 쉽게 Member이름으로 변경(테스트용 Member클래스파일은 바로삭제)

연동되는 클래스파일이름을 RealMember로 안해주고 그냥 Member를 사용한상태로 테이블을 생성했었었다.

그리고, 다시 기존 Member 클래스파일을 지우고 RealMember 클래스파일 이름을 MemberRENAME으로 바꿔주었다.

 

2. 의문점

이미 한번 과거 Member 안에 작성된 코드를 이용해서 생성된 테이블 을 한번 만들어줬다가

이름만 바꿔서 코드내용 바꿔주어서 다시 생성하면 변경된대로 적용되는지 궁금하다.

 

3. 디비 h2 맞고, 연동도 되어 있다.

H2 데이터베이스 콘솔접속해서 테이블들을 확인해보니 RealMember는 그대로 있고 Member도 그대로 있다.

테이블에서는 영향을 미치지않아 내가 직접 drop해주어야 하는 건지 모르겠다.

 

문제해결시도과정

1. 이름이 변경된 Member클래스에서 Member를 import 설정

Build completed with 2 errors and 0 warnings in 11 s 105 ms

빌드하는 과정에서 에러가 두가지 있었는데 Memberimport를 해주었다.

바로 밑에 코드 에도 (Member)로 설정

 

 

2.초기화옵션 ddl-auto:create, 데이터베이스에서 기존 Member 테이블 삭제시도

 

사진

 

ddl-auto:create옵션인 상태에서 h2 데이터베이스 접속해서 기존 MEMBER 테이블 삭제하려고 하니

다음과 같은 에러가 나온다.

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

Cannot drop "MEMBER" because "FKPKTXWHJ3X9M4GTH5FF6BKQGEB" depends on it; SQL statement:

DROP TABLE member [90107-200] 90107/90107 (도움말)

org.h2.jdbc.JdbcSQLSyntaxErrorException: Cannot drop "MEMBER" because "FKPKTXWHJ3X9M4GTH5FF6BKQGEB" depends on it; SQL statement:

DROP TABLE member [90107-200]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:576)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:429)

at org.h2.message.DbException.get(DbException.java:205)

at org.h2.command.ddl.DropTable.prepareDrop(DropTable.java:98)

at org.h2.command.ddl.DropTable.update(DropTable.java:124)

at org.h2.command.CommandContainer.update(CommandContainer.java:198)

at org.h2.command.Command.executeUpdate(Command.java:251)

at org.h2.server.TcpServerThread.process(TcpServerThread.java:406)

at org.h2.server.TcpServerThread.run(TcpServerThread.java:183)

at java.lang.Thread.run(Unknown Source)

 

at org.h2.message.DbException.getJdbcSQLException(DbException.java:576)

at org.h2.engine.SessionRemote.done(SessionRemote.java:611)

at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237)

at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:228)

at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:201)

at org.h2.server.web.WebApp.getResult(WebApp.java:1459)

at org.h2.server.web.WebApp.query(WebApp.java:1116)

at org.h2.server.web.WebApp$1.next(WebApp.java:1078)

at org.h2.server.web.WebApp$1.next(WebApp.java:1065)

at org.h2.server.web.WebThread.process(WebThread.java:178)

at org.h2.server.web.WebThread.run(WebThread.java:94)

at java.lang.Thread.run(Unknown Source)

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

 

-여기에서 내가 확인하고 이해한 에러 핵심은 다음과 같다.

-일단 MEMBER 테이블을 삭제할 수 없다. 그리고 Unknown Source 알려지지 않은 소스 Cannot drop "MEMBER"....

.

.

at java.lang.Thread.run(Unknown Source)

 

-기존에 MEMBER클래스파일을 삭제해서 테이블에서도 찾아내지 못해 삭제하지 못하는 것이라는 가설을 세웠다.

 

2. Real_Member 테이블 삭제 시도

-DROP TABLE Real_Member;

-지워진다..

-이것은 Real_Member 이름을 가진 클래스파일을 인식해서인지 삭제가 되었다.

-다시 h2 데이터베이스 재접속 상황은 같다.

 

3. 기존 MEMBER 클래스 파일을 다시 만들어서 삭제한다?

-이미 RealMember클래스파일 이름을 MEMBER파일로 바꾸었는데 다시 만들어서 테이블삭제는 말이 안되었다.

이미 변경한 MEMBER클래스파일은 어떻게 한단 말이지..

 

4. 테이블삭제시도전에 코드를 run하는 과정에서 drop if exists 문구와 error executing ddl를 확인한 것이 기억났다.

 

출처 https://galid1.tistory.com/610

구글링 해보니, 초기화 옵션을 (ddl-auto: update)update로 해주면 에러가 해결된다는 내용이 있었다.

물론 나와는 상황이 조금 달랐지만, 혹시 테이블도 update 되지 않을까 하는 생각으로 변경해주고 다시 테이블 설정을 했다.

 

 

결과는 클래스파일 RealMember에서 RENAME으로 변경한 Member클래스파일에 작성된 컬럼들이 생성됨을 확인했다. 즉 새롭게 변경해준 Member클래스파일 내용으로 update가 되었다.

 

5.기존에 있던 ID, USERNAME은 그대로 존재한다. 기존에 있는 컬럼에 합쳐진 것 같다.

 

맴버테이블을 연관관계없이 생성한 상태일 때에 삭제가 안될 수도 있다고 하여,

기존 멤버테이블 컬럼삭제된 상태에서, 테이블을 삭제 시도 해보았다.

 

하기와 같은 명령어를 이용해 ID, USERNAME을 삭제했다.

ALTER TABLE MEMBER

DROP COLUMN USERNAME;

 

삭제가 되어 현재 변경된 Member클래스 내용과 동일한 내용으로 업데이트하여 해결완료!

 

7.이왕 삭제하는 김에 테이블전부 삭제하고 다시 생성하기로 했다. (ddl-auto : create)

 

*맴버테이블을 연관관계없이 생성한 상태일 때에 삭제가 안될 수도 있다고 하여,

만약 연관관계가 있는 상태에서 삭제가 되지 않는다면 하기 명령어로 해볼 것

 

DROP TABLE : 테이블의 모든 데이터 및 구조를 삭제

-DROP TABLE 테이블명 [CASACADE CONSTRAINT];

 

기타공부내용

기타해결방법(기존 member 클래스파일을 realmember로 변경할 경우에 사용할 것)

-삭제된 member는 이제 더 이상 jpa가 관리하는 persist에 의해 영속성을 가지지 못하고

그냥 orm과는 관계 없고, 자바와는 관계없는 분리된 db테이블이 됨

더 이상 사용되지 않는 테이블이 되었다.

 

ddl-auto : create (ddl-auto옵션은 create)

멤버랑 리얼멤버 테이블을 drop시키고 다시 테이블을 새로 생성해도 무방하다.

의존성을 가진다면 테이블 스페이스를 전체를 다 날려버리면,

스프링이 재시작 될 때에 처음부터 다시 전체 테이블을 만들어줄 것이다.

바뀐 멤버엔티티에 영속성이 걸리게 되고, 연관관계매핑도 작성된대로 설정이 된다.

 

이해를 위한 ddl-auto : create옵션 추가설명

-예를들어, jpashop이라는 폴더를 만들고 그안에 member라는 폴더를 만들고 파일도 있다.

근데 이름을 realmember로 바꾸려하면 create 옵션은

기존 member는 그대로 냅두고 realmember폴더를 새로 만드는 것과도 같다.

10-3 while

while(true or false) {....}

while(rNum (10)

rNum이가 10보다 작을 때까지 프로그램 반복 진행

int i = 1;

while (i < 10) {

System.out.printf("%d * %d = %d\n", num, i, (num * i));

i++;

}

=>INPUT NUMBER : 9

9 * 1 = 9

9 * 2 = 18

9 * 3 = 27

.

.

.

for문과 while문 구성차이

*for문은 i초기값을 안에서 설정하지만, while문은 밖에서 i 초기값을 정한다.

*for문은 증감구성이 안에서 설정되지만, while문은 밖에서 증감구성을 한다.

=while문은 조건식 외에 초기값 및 증감구성은 외부에 존재한다.

 

 

10-4 do ~ while

-while문과 비슷하며,

차이점은 조건결과에 상관 없이 무조건 최초한번은 {...}의 프로그램을 수행 한다.

 

//do ~ while

do {

System.out.println("무조건 1번은 실행합니다.“);

} while (false);

*while문은 처음에 조건식이 있어 true인지 false인지 확인하고 실행구문을 실행

*do while은 조건식이 후에 있어 무조건 실행구문 실행시키고 뒤에 조건식의 true false에 따라 실행구문이 실행된다.

 

실습1

이렇게 작성하니 그냥 하기나 해가 무한반복 된다.

 

실습2

i++;을 명시해주니 무한 반복없이 숫자 20전까지 총 19그냥하기나 해가 반복됨.

*리소스를 다 써버리고 시스템이 꺼지는 경우가 있다고 하니 조심할 것!!!!

 

실습3

while 조건식이 false이니 그냥 하기나 해가 한번만 출력 된다.

'신입개발자로 취업하기까지 > JAVA' 카테고리의 다른 글

20200311 10강 반복문  (0) 2020.06.14
20200310 9강 조건문  (0) 2020.06.14
20200309 8강 배열과 메모리  (0) 2020.06.14
20200306 7강 배열  (0) 2020.06.14
20200305 6-2강 연산자  (0) 2020.06.14

9강 조건문

-어떠한 조건에 따라서 프로그램의 흐름이 결정/변경 되는 것을 조건문이라고 한다.

)사과를 좋아할 경우 사과를 구입한다. 사과를 좋아하지 않을 경우 사과를 구입하지 않는다.

-프로그램의 조건 결과에 따라 양자 택일 또는 다자 택일 진행하는 조건문에 대해 학습합니다.

 

9-1 조건문이란?

-조건의 결과에 따라서 양자 택일 또는 다자 택일을 진행한다.

조건문

1. 양자택일

(주로 if문이 쓰임)

2. 다자 택일

(주로 switch문이 쓰임)

*상대적으로 if문이 더 많이 사용 된다. switch도 많이 사용된다.

 

 

9-2 if

-if(조건식), if(조건식) else, if(조건식) else if(조건식)

)

in num1 = 10;

in num2 = 20;

 

//if(조건식)

if(num1 < num2) {

System.out.println("num1num2보다 작다.“);

}

System.out.println();

=>조건문이 참이라면 실행문이 실행 되고 거짓이라면 실행문을 빠져나와 다른 조건문을 진행한다.

 

//if(조건식) else

if(num1 < num2) {

System.out.println("num1num2보다 작다.“);

=>위에 있는 조건문이 참이면 현 실행문 실행

} else {

System.out.println("num2num1보다 크거나 같다.“);

}

System.out.println();

=>위에 있는 조건문이 false이면 두번째 구문/실행문 실행

 

//if(조건식) else if(조건식) -> else if를 활용하여 여러 가지 조건문을 만들 수 있다.

if(num1 < num2) {

System.out.println("num1num2보다 작다.“);

}else if(num1 > num2){

System.out.println("num1num2보다 크다.“);

} else {

System.out.println("num1num2는 같다.“);

}

=>num1num2 보다 작다면 "num1num2보다 작다.“

num1num2 보다 크다면 "num2num1보다 작다.“

그것이 아니라면 else에서 실행문을 출력한다.

 

주목적은 데이터를 주거니 받거니 하기 위함

-데이터를 주거니 받거니 할 때 중간의 어떠한 조건을 걸어 프로그램을 완성한다.

-예를 들어, 은행에서 10만원을 이체 요청을 할 때, 은행에서 10만원을 이체한다.

-id나 이름 주민번호 등등 조건이 맞으면 이체를 한다. 이럴 때 조건문이 필요하다.

 

실습

 

9-3 switch

-비교대상이 되는 결과값과 선택사항이 많을 경우 주로 사용한다.

-다자택일을 할 때에 사용 된다.

-사용자로부터 값/데이터를 받고 싶을 때(scanner를 이용)

 

//switch

System.out.println("점수를 입력하세요 : “);

Scanner inputNum = new Scanner(System.in);

int score = inputNum.nextInt();

 

switch (score) {

case 100;

case 90;

System.out.println("“);

break;

 

case 80;

System.out.println("“);

break;

 

 

case 70;

System.out.println("“);

break;

 

default:

System.out.println("try again!“);

break;

}

 

inputNum.close();

 

실습1

실습2

 

'신입개발자로 취업하기까지 > JAVA' 카테고리의 다른 글

20200311 10-2강 반복문  (0) 2020.06.14
20200311 10강 반복문  (0) 2020.06.14
20200309 8강 배열과 메모리  (0) 2020.06.14
20200306 7강 배열  (0) 2020.06.14
20200305 6-2강 연산자  (0) 2020.06.14

8강 배열과 메모리

-다수의 데이터를 인덱스로 관리하는 것을 배열이라고 한다.

-배열은 요소들의 집합

 

8-1 배열의 메모리 크기

-배열을 구성하는 데이터의 자료형에 따라서 배열의 메모리 크기가 결정 된다.

 

int[] arr = new int[3];

*int형 데이터가 3개 있다.

*int형 하나가 4byte 이므로 총 메모리의 크기가 12byte인 배열이 만들어진다.

 

8-2 배열을 가리키는 배열이름

-기본 자료형 데이터를 담고 있는 변수와 달리 배열 변수는 배열 데이터의 주소를 담고 .

*객체 자료형은 다른 곳에 객체를 만들고 변수에는 메모리주소(레퍼런스)만 가지고 있다.

 

데이터 구조(저장)관점

변수 i

int i = 10;

 

배열 i

int [] i = new int[3];

-int형 배열 i 안에 데이터가 3개 있다.

-i안에 데이터가 전부 다 들어가는 것이 아니라 전체 큰 메모리에서 데이터가 따로따로 데이터가 들어가 있다.

-i라는 메모리는 별개로 다른 곳에 존재한다.

-그럼 i(배열) 라는 메모리에는 무엇이 들어 있는가?

 10,20,30를 시작하는 메모리 첫 번째 주소만 배열 i에 저장이 되어 있다.

 

index i0번째의 값을 원할 때 하기를 레퍼런스(참조)한다.

index i1번째의 값을 원할 때 하기를 레퍼런스(참조)한다.

index i2번째의 값을 원할 때 하기를 레퍼런스(참조)한다.

i[]주소

10

20

30

i(배열)

i[0]
*메모리 주소 0만 있다.

i[1]

i[2]

 

 

8-3 배열 기본속성

-기본 자료형 데이터를 담고 있는 변수와 달리 배열 변수는 배열 데이터의 주소를 담고 있다.

 

1. 배열의 기본 속성

int[] arrArt1 = {10, 20, 30, 40, 50, 60};

*위에 명령어는 선언과 초기화를 동시에 하고 있다.

*초기화 하는 데 데이터 값 10,20,30,40,50,60

*배열의 크기 6, [](인덱스)0-5까지, 숫자는 기초자료형으로 10,20,30,40,50,60이 들어있다.

 

null이란

-배열을 만들지 않아 주소가 담겨져 있지 않은 상태를 null이라고 한다.

 

int[] arrArt2 = null;

*위에는 배열의 시작하는 주소를 배열 i(int[] i = new int[];)에 넣어 두어야 하는데 아직 배열을 만들지 않아 주소가 담겨져 있지 않은 상태를 null이라고 한다.

int[] arrArt3 = null;

 

2.배열의 길이를 얻어내는 명령어

int[] arrArt1 = {10, 20, 30, 40, 50, 60};

System.out.println("arrArt1.length : " + arrArt1.length);

->arrArt1.length : 6

*배열의길이 출력하는 명령어 arrArt1.length

출력

 

3. 배열요소 출력하는 명령어

int[] arrArt1 = {10, 20, 30, 40, 50, 60};

System.out.println("arrArt1 : " + Array.toString(arrArt1));

->arrArt1 : {10, 20, 30, 40, 50, 60}

*Array.toString(arrArt1));

 

4. 배열 요소 복사하는 명령어

arrArt3 = Arrays.copy0f(arrArt1, arrArt1.length); //복사하려는 배열, 배열의 크기입력

System.out.println("arrArt3 : " + Array.toString(arrArt3));

->arrArt3 : {10, 20, 30, 40, 50, 60}

*배열1의 값을 복사 한다라고 보아야 한다.

 배열1의 값을 복사해서 어딘가의 메모리에 저장한 주소를 arrArt3이 참조한다.

그러므로 arrArt1의 메모리주소와 arrArt3의 메모리주소는 다르다.

 

5. 배열 주소(레퍼런스)를 출력하는 명령어

레퍼런스 - 배열의 값이 저장 되어 있는 주소를 레퍼런스라고 한다.

 

arrArt2 = arrArt1; //arrArt1arrArt2의 배열값이 저장 되어 있는 주소가 같다

System.out.println("arrArt1 : " + arrArt1);

=>I@4554617C

System.out.println("arrArt2 : " + arrArt2);

=>I@4554617C

System.out.println("arrArt3 : " + arrArt3);

=>I@74a14482

 

 

8-4 다차원 배열

-이전까지는 1차원 배열을 알아보았지만, 3차원,4차원 다차원 배열이 있다.

 

다차원 배열

-배열의 각 요소안에 또다시 배열이 들어간다는 개념

-2차원 배열까지는 사용하지만

-3차원 배열은 거의 사용하지 않는다. 이유는 너무나 많은 메모리를 사용하게 되므로 퍼포 먼스가 나오지 않고, 로직이 복잡해질 수 있다.

 

int[] arrArt1 = {10, 20, 30);

*10안에 100이라는 배열값이 있다. 행 열 개념으로 존재

 

2(2차원 배열)

3

10

100

20

200

30

300

 

int[][] arrMul = new int[3][2]; // 32

-2차원 배열을 하기처럼 값을 넣어준다. 행 열로 개념으로 접근한다.

-arrMul[0],[1],[2] -> 3행

-arrMul[0],[1] ->2열

 

arrMul[0][0] = 10; //0행의 0번째 값 출력

arrMul[0][1] = 100; //0행의 1번째 값 출력

arrMul[1][0] = 20; //1행의 0번째 값 출력

arrMul[1][1] = 200; //1행의 1번째 값 출력

arrMul[2][0] = 30; //2행의 0번째 값 출력

arrMul[2][1] = 300; //2행의 1번째 값 출력

 

System.out.println("arrMul[0] : " + Arrays.toString(arrMul[0]));

=>arrMul[0] : [10, 100]

System.out.println("arrMul[1] : " + Arrays.toString(arrMul[1]));

=>arrMul[1] : [20, 200]

System.out.println("arrMul[2] : " + Arrays.toString(arrMul[2]));

=>arrMul[2] : [30, 300]

'신입개발자로 취업하기까지 > JAVA' 카테고리의 다른 글

20200311 10강 반복문  (0) 2020.06.14
20200310 9강 조건문  (0) 2020.06.14
20200306 7강 배열  (0) 2020.06.14
20200305 6-2강 연산자  (0) 2020.06.14
20200305 6강 연산자  (0) 2020.06.14

7강 배열

-데이터를 관리하기 위한 가장 기본적인 방법

-다수의 데이터를 인덱스를 이용해서 관리

 

7-1 배열이란?

-인덱스를 이용해서 자료형이 같은 데이터를 관리

-데이터를 여러개로 나열해서 한번에 인덱스(0 ~ n-1 번호로)을 붙여서 관리한.

-배열의 길이(n)=배열크기

데이터

데이터

데이터

데이터

데이터

데이터

데이터

데이터

데이터

데이터

데이터

번호

1

2

3

4

5

6

7

8

9

10

인덱스

(실제

관리하는 번호)

0

1

2

3

4

5

6

7

8

9

배열길이 : n

*데이터가 10개라면 배열의 길이는 10개라고 볼 수 있다. 인덱스는 0부터 9까지 있다.

 

배열 사용 예)

*(비교)변수는 데이터 하나만을 관리 할 수 있었다.

변수의 예) int a =10 데이터 하나만을 10에 넣어서 관리했다.

 

배열사용 예

아파트 호수 관리 : 101, 201, 301....401, 501

회사 사번 관리 : 홍길동(k-0001), 홍길자(k-0002), 홍길순(k-0003)....

학급 학생 관리 : 박찬호(01), 이승엽(02), 박용택(03), 홍성훈(04)

 

 

 

7-2 배열 선언 및 초기화

배열

-변수와 마찬가지로 선언과 초기화 과정을 거쳐 사용한다.

-배열 선언과 초기화를 동시에 사용이 가능하다.

배열 선언 후 초기화

배열 선언과 초기화를 동시에

int[] art1 = new int[5]

art1[0] = 100;

art1[1] = 200;

art1[2] = 200;

System.out.println("arr1[0]:" + arr1[0])

System.out.println("arr1[1]:" + arr1[1])

int[] art2 = {10, 20, 30};

System.out.println("art2[0] : " + arr2[0]

System.out.println("art2[1] : " + arr2[0]

System.out.println("art2[2] : " + arr2[0]

*배열의 선언과 초기화 할 때 배열은 다수 데이터를 인덱스로 한번에 관리한다.

그 데이터 안에 자료형이 있다. 자료는 동일해야 한다.

예를 들어 char이면 charintint형 으로 데이터를 입력해야 한다.

(int형에 char형에 해당하는 문자를 넣으면 에러가 발생한다.)

 

배열 선언 및 초기화 순서

a. int -> 배열 안에 들어가는 데이터 자료 형을 먼저 정하기

b. [] -> 배열기호(배열변수를 선언하는 기호)

c. arr1 -> 배열이름

d. new -> new라는 연산자 키워드

e. int[5] -> 배열의 크기를 명시, 배열의 크기만큼 메모리를 확보했다는 의미

f. arr1[0] = 100; 첫 번째 인덱스에 순서와 값을 넣는다, 그 다음 순서 이어서...

 

배열선언 및 생성

int[] arr1 = new int[5];

*이렇게도 가능

int[] arra1; ->배열선언

arr1 = new int[5]; -> 배열 생성

배열의 초기화

arr1[0] = 100;

arr1[1] = 200;

 

출력명령어

System.out.println("arr1[0] : " + arr1[0]);

System.out.println("arr1[1] : " + arr1[1]);

 

출력값

arr1[0] : 100

arr1[0] : 200

*선언/초기화/메모리배열이 정상적으로 만들어졌다고 볼 수 있다.

*자바에서의 배열은 한번 크기가 정해지면 변경 될 수가 없다.

*내가 찾아본 자료

반복문을 이용하여 출력 가능

)

int[] grades = new int[5];

 

grades[0] = 90;

grades[1] = 93;

grades[2] = 100;

grades[3] = 85;

grades[4] = 99;

 

for (int I = 0; i<5; i++) {

System.out.println(grades[i]);

}

 

*import 하는 방법

import 할 파일이 d드라이브가 아닌

c드라이브에 있다고 할 때에 workspace를 변경해야 한다.

file->Switch Workspace->C:\ + 프로젝트가 있는 경로 누르기

 

마우스 우클릭-> import

 

 

7-3 배열을 이용한 학사관리

String[] name = {“박찬호”, “이승엽”, “박병호”, “이병규”, “류현진”};

//String ->자로형이 문자열로 만들어진 배열

int[] score = new int[5];

Scanner scanner = new Scanner(System.in); //->객체 생성을 해서 사용을 함.

//Scanner -> 사용자로부터 무언가(데이터)를 받을 때 사용하는 클래스

 

System.out.printf("%의 점수를 입력하시오. : “, name[0]);

//박찬호의 점수를 입력하시오 라는 뜻

 

score[0] = scanner.nextln();

//->사용자가 데이터 입력하기를 기다린다. 점수를 입력하면 score 배열 인덱스0에 점수가

들어가게 된다.

//scaner가 데이터를 입력 받는 곳

 

scanner.close(); //->리소스를 클로즈 해주고 반환하는 명령어

 

학사관리 실습

import java.util.Scanner 입력

 

 

'신입개발자로 취업하기까지 > JAVA' 카테고리의 다른 글

20200310 9강 조건문  (0) 2020.06.14
20200309 8강 배열과 메모리  (0) 2020.06.14
20200305 6-2강 연산자  (0) 2020.06.14
20200305 6강 연산자  (0) 2020.06.14
20200304 5강 특수문자와 서식 문자  (0) 2020.06.14

6-6 증감연산자

++

1만큼 증가

1) ++x -> 전이연산자 (x = x+1; 와 같음)

x = 10;

System.out.println("++x : " + (++x));

=>++x : 11

*연산하고 나서 출력이 된다.

 

2) x++ -> 후이연산자

x = 10;

System.out.println("x++ : " + (x++));

=> x++ : 10

System.out.println("x : " + (x));

=> x : 10

*x 값 그대로 출력을 먼저하고 더하게 된다. 메모리상태에만 11이 담겨 있다.

위에 명령어 영향으로 인해 밑에서의 x11로 출력이 된다.

--

1만큼 감소

1) --x -> 전이연산자 (x = x-1; 와 같음)

x = 10;

System.out.println("--x : " + (--x));

=>--x : 9

*연산하고 나서 출력이 된다.

 

2) x-- -> 후이연산자

x = 10;

System.out.println("x-- : " + (x--));

=> x-- : 10

System.out.println("x : " + (x));

=> x : 9

*x 값 그대로 출력을 먼저하고 더하게 된다. 메모리상태에만 9가 담겨 있다.

위에 명령어 영향으로 인해 밑에서의 x9로 출력이 된다.

 

 

6-7 논리연산자

-피연산자의 논리곱(AND), 논리합(OR), 논리부정(NOT)을 수행함

&&논리곱(AND)

a && b : ab가 모두 참이면 참

*&& : AND연산자

bootlean b1 = false;

bootlean b2 = true;

System.out.println("b1 && b2 : " + (b1 && b2));
b1 && b2 : false

*모두 참이어야 참

||논리합(OR)

a || b : ab중 하나라도 참이면 참

*|| : OR연산자

bootlean b1 = false;

bootlean b2 = true;

System.out.println("b1 || b2 : " + (b1 || b2));

=> b1||b2 : true

*둘중에 하나라도 참이면 참

!논리부정(NOT)

!a : a의 상태를 부정

* ! : NOT연산자

bootlean b1 = false;

bootlean b2 = true;

System.out.println("!b1 : " + !b1));

=> !b1 : true

System.out.println("!b2 : " + !b2));

=> !b1 : false

*참이면 거짓으로 거짓이면 참으로

 

실습

 

 

6-8 조건(삼항)연산자

-삼항 연산자로 두 개의 피연산자 연산 결과에 따라서 나머지 피연산자가 결정된다.

조건식? 1 : 2

조건식이 참이면 식1이 실행

조건식이 거짓이면 식2가 실행

)

x = 10; y=20;

int result = 0;

result = (x > y) ? 100 : 200;

//(x>y) -> 조건식, 100 -> 1, 200 -> 2

System.out.println("result : " + result);

=> result : 200

 

result = (x < y) ? 100 : 200;

System.out.println("result : " + result);

//(x<y) -> 조건식, 100 -> 1, 200 -> 2

=> result : 100

 

result = (x == y) ? 100 : 200;

System.out.println("result : " + result);

//(x==y) -> 조건식, 100 -> 1, 200 -> 2

=> result : 200

 

 

 

 

6-9 비트 연산자

-c계열에서는 많이 쓰이지만 자바에서는 메모리를 직접관리하지 않기 때문에

 

비트연산자는 많이 쓰이지 않는다.

-데이터를 비트(bit)단위로 환산하여 연산을 수행하며, 다른 연산자보다 연산 속도가 향상 된다.

 (우리가 느낄 수 없을 정도의 빠르기로 속도가 향상된다.)

&: AND 연산

a & b : ab가 모두 1이면 1

| : OR연산

a|b : ab중 하나라도 1이면 1

^: XOR연산

a^b : ab가 같지 않으면 1

 

연산원리

x = 2; //10진수를 2진수 비트단위로 환산시 00000010

y = 3; //10진수를 2진수 비트단위로 환산시 00000011

x=2

0

0

0

0

0

0

1

0

y=3

0

0

0

0

0

0

1

1

*환산한 숫자에서 xy를 나열하여 아래위로 10인지를 확인하여

연산(위에내용)을 하기처럼 한다.

&

0

0

0

0

0

0

1

0

|

0

0

0

0

0

0

1

1

^

0

0

0

0

0

0

0

1

 

)

System.out.println("x & y : " + (x & y));

=> 00000010 => x & y : 2

 

System.out.println("x ^ y : " + (x | y));

=> 00000011 => x ^ y : 3

 

System.out.println("x ^ y : " + (x ^ y));

=> 00000001 => x ^ y : 1

'신입개발자로 취업하기까지 > JAVA' 카테고리의 다른 글

20200309 8강 배열과 메모리  (0) 2020.06.14
20200306 7강 배열  (0) 2020.06.14
20200305 6강 연산자  (0) 2020.06.14
20200304 5강 특수문자와 서식 문자  (0) 2020.06.14
20200304 4-3강 형 변환  (0) 2020.06.14

+ Recent posts