@RequestParam 

▶ @RequestParam (required = true)  // 필수입력이지만 값 입력x 시 400대(Client) Error

▶ @RequestParam (required = false, defaultValue="url에 값이 없을때 대입시킬 기본값")

    //defaultValue 주지 않으면 500대(Server) Error

[EX]

public String main(HttpServletRequest request){  }


public String main2(@RequestParam(name="year", 
                                                        required=false)

== public String main2(String year) {  }

public String main3(@RequestParam(name="year", required=true) String year)
  == public String main3(@RequestParam String year) {   }



public String main5(@RequestParam(required=false, defaultValue="1") String year) {  } 


[RequestMapping 대신 Get/PostMapping사용] 

      ex) 경로- "/mapping/examp" (메소드로 구분)

▶@RequestMapping((공통경로)"/mapping") + GetMapping("/examp") / PostMapping("/examp")

 

- @GetMapping 

== @RequestMapping(value="경로", method=RequestMethod.GET)

== <servlet-context.xml>파일에 <view-contorller path="경로" view-name="jsp파일명"/>추가  (GET만 허용)

 

- @PostMapping("경로")  

== @RequestMapping(value="경로", method=RequestMethod.POST)

 

 @ModelAttribute 

 : 적용대상을 Model의 속성으로 자동 추가해주는 애너테이션, 반환타입 or 컨트롤러 메서드의 매개변수에 적용가능

 > 호출, 저장이 따로 필요 없음

 

[EX]

@Controller
public class 클래스{

    public String main(@ModelAttribute("myDate") MyDate date, Model m) { 
      == public String main(@ModelAttribute MyDate date, Model m) { 

      == public String main(MyDate date, Model m) {  //참조형(MyDate date)은 @ModelAttribute 생략가능

      // 1. 유효성 검사 
        if (!isValid(date))   return "yoilError";
      // 2. 처리
        char yoil = getYoil(date);

      // 3. Model에 작업한 결과를 저장할 필요 없음  View로 자동 전달됨.

      // 4. 작업 결과를 보여줄 뷰의 이름을 반환  
           return "yoil";

    }

}

> 컨트롤러 매개변수가 기본형,string일때 : @RequestParam생략된 것
> 컨트롤러 매개변수가 참조형일때 : @ModelAttribute 생략된 것

 redirect 

[in JSP]

 300번대(응답헤더)응답시 자동으로 헤더의 location으로 재요청(GET) / 요청과 응답이 2번

[in Spring]

 DispatcherServlet에 요청> Controller의 메소드 호출 > Controller가 리턴값(redirect:경로) 전달 > DispatcherServlet가 RedirectView에 전달 > 응답 

 

 forward 

[in JSP]

 잘못된 경로로 혹은 일부만 처리할 수 있는 파일(1jsp)에 요청시 가능한 처리하고 다른 파일(2jsp)로 요청전달

> 응답 > 1jsp가 2jsp에 request를 Model(request객체)에 담아서 전달 / 1jsp = Controller역할, 2jsp = View역할 (MVC패턴)

[in Spring]

 DispatcherServlet에 요청> Controller의 메소드 호출 > Controller가 리턴값(forward:경로")을 DispatcherServlet에게 반환 > DispatcherServlet가 InternalResourceViewResolver에게 받은 문자열 전달 > 해석 후 다시 서블릿에 반환 > JstlV iew에 경로를 전달 > Jsp파일에 Model을 전달 > Jsp파일이 응답

 

 Cookie 

: 이름과 값의 쌍으로 구성된 정보로 아스키 문자만 가능

: 서버에서 생성/ 브라우저에 저장/ 유효기간 이후 자동삭제

: 서버에 요청시 domain, path(하위경로포함)일치시 전송(응답헤더: Set-Cookie: id=id값; Max-Age=86400)

 

* 생성

Cookie cookie = new Cookie("id","id값"); //쿠키생성
cookie.setMaxAge("60*60*24"); //유효기간설정[sec] (=24시간)
response.addCookie(cookie); //응답에 쿠키 추가

개발자 도구에서 생성 > [Application] [Cookies] 탭에서 name, value값 입력

쿠키 존재시 login form에 자동으로 아이디 기억 체크박스 체크하기 > ${empty cookie.id.value ? " " : "checked"}

 

* 삭제 ( =유효기간이 0)

Cookie cookie = new Cookie("id",""); //동일한 이름 쿠키생성
cookie.setMaxAge(0); //유효기간설정[sec] (=0 =삭제)
response.addCookie(cookie); //응답에 쿠키 추가

* 읽기

Cookie[] cookie = request.getCookies(); //read, 존재x시 null
for(Cookie cookie:cookies){
	String name = cookie.getName(); // id
    String value = cookie.getValue(); // id값
	System.out.println(name, value);
}

 Session 

: 서로 관련된 독립된 요청들을 쿠키를 이용하여 하나로 묶은 것으로 쿠키가 브라우저에 저장되므로, 브라우저마다 개별 저장소(Session)를 서버에서 제공 > 쿠키는 브라우저에, 세션은 서버에 저장

 


  Spring DI(Dependency Injection)  

** DI 의존성주입 : 사용할 객체를 외부에서 주입(라이브러리의 매개로) 받는것 

 

[in Java] Beans : 재사용 가능한 컴포넌트, 상태(iv),. 게터&세터, no-args constructor

[in Servlet & JSP] Bean : (mvc의)Model, EL, Scope, JSP container가 bean을 관리

[in Spring] Bean

: 복잡한 EJB의 규칙을 심플하게 만듬 (POJO), Spring container가 관리하는 객체 - 단순, 독립적

<.xml> bean 정의됨

→ spring container에서 읽어드리고 클래스/객체관리, bean저장/관리(생성, 소멸, 연결(AutoWired))

 

IoC(Inversion of Conrol, 제어의 역전)

: 제어(if, for)의 flow흐름을 전통적인 방식과 다르게 뒤바꾸는 것

: 변하지 않는 코드만 라이브러리안에, 잘 변하는 코드는 사용자 코드에 작성 (= DI 의존성주입)

ex)

전통적인 방식
사용자가 라이브러리 코드를 호출
 IoC
라이브러리에서 사용자 코드를 호출
[사용자]
Car car = new Car();
car.turboDrive();

[라이브러리]
void turboDrive(){
  engine = new turboEngine();
  engine.start();
}
[사용자]
Car car = new Car();
car.drive(new turboEngine()); // 수동연결

[라이브러리]
void turboDrive(){
  engine.start();
}

 

> 변경에 유리한 코드 

** 다형성 

class SpotsCar { }
class Truck { }

SpotsCar car = new SpotsCar();

Truck car = new Truck();
class Car{}
class SpotsCar extends Car{}
class Truck extends Car{}

Car car = new SpotsCar();
Car car = new Truck();

 팩토리메서드 

Car car = getCar();

static Car getCar() { return new SpotsCar() || new Truck();}

 

 Map과 외부파일  (파일.txt의 내용만 변경하면 됨) 

public static void main(String args[]){
	// 리턴 받은 객체 해당 클래스로 형 변형
	Car car = (Car)getObj("key값");
	// 호출부분만 변경하면 용이
	클래스 객체참조변수 = (클래스)getObj("key값");
}
static Obj getObj() {
	 //Properties:(String,String) == Map:(String,obj)
	Properties p = new Properties();
    // 파일.txt > key = 패키지명.class명
	p.load(new FileReader("파일.txt");
	Class clazz = Class.forName(p.getProperty(key));
	 // 객체 생성후 반환
	return clazz.newInstance();
}

 컨테이너사용 

자동객체 등록하기 (위 코드에서 getbean 추가)

 

 @Autowired 객체 자동연결 

guava 다운로드 -  https://mvnrepository.com/artifact/com.google.guava/guava/31.1-jre

[pom.xml]

<dependencies>
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version>
</dependency> //추가해줌
...
</dependencies>

이후 우클> maven > reload

 

: 인스턴스변수iv, setter, 참조형 매개변수를 가진 생성자, 메서드에 적용

: 생성자(construtor)는 @Autowired 생략가능

Appcontext()에 추가

 

: 타입(value로 instance of) 검색해서 연결

: 검색된 bean이 여러개 > 참조변수와 이름이 일치하는 것 주입

 

@Component // == Component ("turboengine == bean의 id ")

class TurboEngine extends Engine{}

-------

@Component ("engine") //engine == bean의 id

class SuperEngine extends Engine{}

 

> DI대상이 변수일때

@Autowired Engine engine;  //1개가 아니면 예외발생

// SuperEngine과 이름 일치 >  주입

 

> DI대상이 배열일때

@Autowired Engine[] engines;//bean이 0~n개여도 예외발생 x

// SuperEngine과TurboEngine 모두 주입

 

 

 

 

 

 

 @Resource (name=" bean의 id") 

: 이름(key값=name)으로 bean 검색하여 참조변수에 연결(자동주입 DI)

: 일치하는 이름(name)의 bean 없으면 예외 발생

: name생략가능> 참조변수 이름이 bean의 name이 됨

ex) 

class Car {

  @Resource(name="engine")  Engine engine; }

 

 

**setter로 객체의 값 set시

class Car {
    String color;
    int oil;
    Engine engine;
    Door[] doors;
    ..//getter, setter
 }
 
 public static void main(String[] args) {
        Car car1 = (Car) ac.getBean("car");
        Engine engine = (Engine) ac.getBean("engine");
        Door door = (Door) ac.getBean("door");

        car1.setColor("red");
        car1.setOil(100);
        car1.setDoors(new Door[]{ (Door) ac.getBean("door"), (Door)ac.getBean("door")});
        car1.setEngine(engine);
 }

setter 사용 대신 

[config.xml]의 bean으로 작성   

<bean id="car" class="com.fastcampus.ch3.Car">
        <property name="color" value="red"/>
        <property name="oil" value="100"/>
        <property name="engine" ref="engine"/>
        <property name="doors">
            <array value-type="com.fastcampus.ch3.Door">
                <ref bean="door" />
                <ref bean="door" />
            </array>
        </property>
</bean>

<bean id="engine" class="com.fastcampus.ch3.Engine"/>
<bean id="door" class="com.fastcampus.ch3.Door" scope="prototype"/>

 



[내일배움카드] [국비지원교육]

MVC

클라이언트 :  서비스 요청하는 애플리케이션(or PC)

서버: 서비스를 제공하는 애플리케이션(or PC)  > Email/ File/ Web server

WAS(Web Application server): 웹 애플리케이션을 서비스하는 서버/ 서버에 프로그램을 설치하고 웹에서 보여줌

 #Tomcat 

-Server : 서버> 서비스 > 엔진(서비스를 처리) > HOST> Context (서블릿 여러개) = 프로젝트

      주소형식 = Host명/context명/서블릿명

-설정파일

: conf/server.xml (서버설정) | conf/web.xml (모든 web app의 공통설정) | WEB-INF/web.xml (web app의  개별설정)

 

프로토콜 : 서로 간의 통신을 위한 약속, 규칙으로 주고받을 데이터에 대한 형식을 정의한 것

- HTTP(텍스트기반) 응답메시지

> 형식: 상태라인(HTTP/1.1 상태코드 상태설명) / 헤더 / 빈줄(헤더, 바디 구분) / 바디(응답내용)

#상태코드 : 1**(informational) 2**(성공) 3**(Redirect- 다른URL로 요청필요) 4**(client error) 5**(server error)

- HTTP(텍스트기반) 요청(GET/ POST) 메시지

> 형식: 요청라인 / 헤더 / 빈줄 / 바디

- GET: 리소스를 받는(Read) - 요청라인에 쿼리스트링으로 요청, 바디 없음, 보안취약, 소용량

- POST: 서버에 data(바디내용)를 전송/제공 (Write), 대용량가능 => 게시판 글쓰기, 로그인, 회원가입

 ▶개발자도구의 Network 탭에서 확인 가능

 

OOP 5대 설계원칙 - SOLID

> SRP: 단일책임 원칙 (하나의 메서드는 하나의 책임을 진다, 관심사/ (un)common /중복(입출력)코드 의 분리)

> OCP: 개방-폐쇄 원칙 

> LSP: 리스코프 치환 원칙 

> ISP: 인터페이스 분리 원칙 

> DIP: 의존성 역전 원칙 

 

ex) 요일을 계산해주는 프로그램 > MVC패턴으로 개선

 

isVaild함수 return true일때와 false일때

jsp파일내용

한글이 깨질때 : <%@ page contentType="text/html;charset=utf-8" %>

 

- Servlet  (싱글톤) 

@WebServlet  =  @Controller(메소드에 맵핑) + @RequestMapping

 > 해당 클래스는 HttpServlet 상속, 메소드HttpServletRequest request, HttpServletResponse response 필요

@WebServlet 
public class 클래스 extends HttpServlet {

   @Override
    public void 클래스(HttpServletRequest request,                 HttpServletResponse response) { }}
@Controller
public class 클래스{
    @RequestMapping
    public void main( HttpServletResponse response){ }
}

 

 

요청

> 존재x > 인스턴스 생성

> 서블릿 인스턴스 존재시

서블릿 클래스 로딩

init() 초기화

service() 호출할때마다 반복수행

 

- JSP (Java Server Pages) 

html안에 java코드가 존재하는 것, servlet과 동일 

동작) jsp작동 시 servlet으로 변환 >  servlet 클래스파일 컴파일 > servlet 인스턴스 생성

파일 저장 위치- src/main/webapp

<%! servlet의 클래스 영역 내용%>  <% servlet의메소드 내부에 존재함 %>

*기본객체 : 생성없이 사용할 수 있는 객체 (ex -request, response, pageContext, config, application, page, out 등)

 - EL (Expression Language)표현식 

    <%=값%>을 사용하지않기 위해 ${값}을 사용하는 표현식, lv(지역변수)는 사용불가, 값을 읽을 수 있음, null출력안함

[EX]

requset객체 안에 attribute 라는 Map(이름- request scope)저장 

key = name, value = silver로 저장

color 
= <%=person.getCar().getColor()%> //red
= ${person.getCar().getColor()} <br> //red
= ${person.car.color} <br>  //red

name 
= ${name} //Silver   
= ${requestScope.name} //Silver  
= <%=request.getAttribute("name")%> (EL불가) //Silver

name == "Silver" 
= ${ name eq "Silver"} // true
= ${name.equals("Silver")} // true

= ${name == "Silver" // true

name != "Silver"
= ${name != "Silver" // false
= ${name ne "Silver"}) // false


id 
= <%=request.getParameter("id")%> //null
= ${pageContext.request.getParameter("id")} //출력x
= ${param.id} <br> //출력x
Scope 기본객체
page pageContext
requst requst
session session
application application

 

- JSTL(JSP Standard Tag Lib) : <%태그%>사용하지 않기 위해 사용 <접두사:태그명 ~> 형식

 (접두사)

<c: 상단에 <%@ taglib prefix="c"  uri="http://java.sun.com/jsp/jstl/core"%> 선언한것으로 core 라이브러리를 사용

<fmt: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 선언한것으로 fmt 라이브러리를 사용

 

[EX]

<c:set  var="to"   value="10"/> //저장소에 저장 (key = var값, value = value값)으로 page Scope 생략한것

<c:forEach  var="i" begin="1" end="${to}">  ${i} </c:forEach> //1부터 10까지 출력

<c:set  var="arr"  value="10,20,30,40,50,60,70"/> // 배열생성

<%-- varStatus는 count와 index멤버를 가지고 있음 --%>

<c:if test="${not empty arr}">

    <c:forEach var = "elem"  items="${arr}" varStatus="status">
         status.count = ${status.count} / status.index = ${status.index}<br>
         arr[${status.index}]=${elem
    </c:forEach>
</c:if>

 

//주소창에 ?msg = 메시지 입력하면 출력됨
<c:if test="${param.msg == null}"> 메시지가 없습니다. </c:if>
 <c:if test="${param.msg != null}">
        msg = ${param.msg}   //태그를 인식하고 내용만 출력
        msg = <c:out value="${param.msg}"/>  //태그를 인식하지 않고 그대로 출력
</c:if>

 

 - Filter 

서블릿의 전처리 후처리 중복코드를 필터에 넣음

- 필터 1개
요청 > [필터] 전처리 > [필터] 서블릿 호출 
    > [서블릿] 처리 > [필터] 후처리
- 필터 2개
요청 > [필터1] 전처리 > [필터1] 필터2 호출 > [필터2] 전처리
    >[필터2] 서블릿 호출 > [서블릿] 처리 > [필터2] 후처리 > [필터1] 후처리

 

 

[내일배움카드] [국비지원교육]

 다운캐스팅 

> 업캐스팅된 클래스를 다시 원래의 타입으로 형 변환하는 것으로 하위클래스로의 형변환은 명시적으로 해야함

   묵시적) 상위클래스명 name2 = new 하위클래스명();

   명시적) 하위클래스명 name1 = (하위클래스명)name2;

** 인스턴스 형 체크 방식 : 상위클래스명 instance of 하위 클래스명 //return ture or false

 

 추상클래스 

> 구현코드 없이 메서드의 선언(반환타입, 메서드 이름, 매개변수로 구성)만 있고 구현부({ 바디 부분 })는 없는 추상 메서드를 가지고 있는 클래스로 new키워드로 인스턴스화 불가

> 상속하기 위해 만듬 (public) abstract  class 클래스명 {  }

  # 추상클래스의 추상 메서드 : 하위 클래스가 상속하여 구현

  #추상클래스 내 추상메서드 : 상속받은 하위 클래스가 구현할 메서드

  # 추상클래스 내의 구현된 메서드:  하위 클래스가 공통으로 사용하는 메서드

 

 템플릿 메서드 패턴 

> 메서드를 활용하여 코드 흐름을 정의하는 메서드 설계패턴

> 변해야 하는 부분은 추상메서드로 선언하여 하위 클래스에서 구현

 

 인터페이스 

> 모든 메서드가 추상 메서드, 모든 변수는 상수

> 클래스나 프로그램이 제공하는 기능을 선언하는 일종의 클라이언트 코드와의 약속

> 클라리언트 프로그램은 인터페이스에 선언된 메서드 명세를 보고 클래스 사용가능하며 인터페이스를 구현한 다양한 객체를 사용 (다형성)

>  jdbc(oracle, MySQL등)와 java를 connection으로 연결 > connection은 인터페이스 =  JDBC인터페이스

> 하나의 클래스가 여러 인터페이스 구현 불가

 

디폴트메서드

> 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드로 default 키워드를 사용하여 선언, 하위 클래스에서 재정의 가능

default 타입 메서드명(){ }

정적메서드

> 인스턴스 생성하지 않아도 인터페이스 타입으로 사용할 수 있음

static 타입 메서드명(){ }

private메서드

> 인터페이스를 구현한 하위 클래스에서 재정의 불가하며 인터페이스 내부에서만 사용, default메서드와 static메서드에서 사용

static 타입 메서드명(){ }

ex) 위 calc인터페이스에 privatt, default, static메소드 추가 후 test 실행

//private 메서드
private void myMethod(){
    System.out.println("==myMethod==");
}
private static void myStaticMethod(){
    System.out.println("==myStaticMethod==");
}

//디폴트 메서드
default void description(){
    myMethod();
    System.out.println("정수의 사칙연산 완료");
}
//정적 메서드
static int total(int[] arr){
    myStaticMethod();
    int total = 0;
    for(int num : arr){
        total += num;
    }
    return total;
}

 

<인터페이스활용 다형성 구현>

하나의 인터페이스(userInfoDao)를 여러 객체(userinfo, userinfoMySqlDao, UserInfoOracleDao)가 구현하면

클라이언트 프로그램(UserInfoClient)은 인터페이스의 메서드를 활용하여 여러 객체 구현

 

DAO (Data Access Object)

> 데이터 베이스나 외부 파일 시스템과 같은 영속성 메커니즘에 접근하여 데이터의 CRUD 처리하는 객체 or 패턴

> 고수준인 Business Logic과 저수준인 Persistence Logic을 분리하기 위해, Persistence Logic을 캡슐화 하고 도메인 레이어에 객체지향적인 인터페이스를 제공하는 객체

영구 저장소: MySQL, PostgreSQL, MongoDB 등 

출처-hudi.blog

 여러 인터페이스 구현 

> 해당 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스의 메서드만 사용가능

> 사용할 클래스에서 디폴트 메서드 중복시 구현 클래스에서 재정의

 인터페이스 상속 

> 인터페이스 사이에도 상속을 사용할 수 있음

ex) 

<자식인터페이스.java>
interface 자식인터페이스 extends 부모인터페이스{ }
<하위클래스.java>
public class 클래스명 implements 자식인터페이스{ }

[내일배움카드], [국비지원교육]

 

단축키 변경 및 확인방법 [settings] keymap || ctrl+shift+A

esc : 누르면 커서 에디터창으로 

sout : System.out.println 자동완성

soutv : System.out.println (변수) 자동완성

변수명.soutv : System.out.println (변수) 자동완성

 

코드에서 검색 = ctrl + f 해당내용 변경 = ctrl + r

한줄 주석 = ctrl + /  여러줄 주석 = 주석 드래그 후 ctrl + shift + / 

들여쓰기 = [code] Auto indent Lines || ctrl+alt+i

코드 감싸기(조건문 or 반복문 or 예외처리문 등) = 코드 드래그 후 [code]  surround With || ctrl+alt+t

 

 

< spring파일 import >

zip파일 압축해제 후 인텔리 프로젝트 파일경로에 붙여넣기

open - maven file

Add configuration

- [Server 탭] new > tomcat Server > local 클릭 - name(Tomcat)> 서버위치(configure 클릭후 tomcat폴더 선택)

- [deployment 탭] Artifact추가 ~:war(압축 풀린채로 배포)클릭 > context칸에서 war지움 > ok

- 실행

 

# annotaiton WebServlet 인식x

  > [file] project Structure > Libraries > + Java > tomcat폴더의 lib 폴더 선택후 name지정

plug-in org.springsource.ide.eclipse.commons.gettingstarted was unable to instantlate class
java.lang.ExceptionInInitializerError 

 

1.

java19 삭제 -> java11로 다시 다운로드

환경변수 JAVA_HOME 경로변경

PATH =  %JAVA_HOME%\bin 추가

2.

<sts.ini>파일에

-vm
C:\jdk11\bin\javaw.exe

추가입력후 다시 sts 실행

 

> dashboard의 오류는 그대로 뜨지만

무시하고 파일 생성하니 잘 됨

 

 

 

 

 

MVC regercy 생성 후 can not find the tag library descriptor for "http://java.sun.com/jsp/jstl/core" 에러
The URI depends on the version of JSTL you are using.
For Version 1.0 use: http://java.sun.com/jstl/core for 1.1 (and later), you need to use: http://java.sun.com/jsp/jstl/core

변경하니 x표시 사라짐 (출처 - https://stackoverflow.com/a/13285883 )

 

<복습 문제>

 

 

 참조 자료형  - String/ Date/Student 등

클래스형으로 선언, 클래스에 따라 메모리 크기가 다름, String을 예외하고 사용시에 변수에대해 생성해야함

 § 정의 후 사용방법

< subject.java >

public class Subject { String SubName; int Score; }

 

 접근제어 지시자 

private - 동일 클래스 내에서만 접근 가능

protected - 동일 패키지내에서 or 상속관계에 있는 private를 사용하고 싶을때 사용하여 접근 가능

public - 어디서나 접근 가능

x - 같은 패키지내에서 접근 가능(다른 패키지에서 사용시 import )

 

 캡슐화 

정보은닉을 활용한 캡슐화 - 꼭필요한 정보와 기능만 외부 접근허용 (인터페이스만 제공함)

오류 최소화함

 

 this 키워드 

인스턴스 자신의 (heap)메모리를 가르키며 자신의 주소를 return / 생성자에서 또 다른 생성자를 호출할때 사용

클래스 내에서 참조변수가 가지는 주소값과 동일한 주소값을 가지는 키워드

ex) 위 Student 클래스에서  Student 생성자 생성 시 멤버변수을 입력 받음  > this.참조변수 = 매개변수;

 

#생성자의 역할: 인스턴스 초기화

클래스에 생성자가 여러개인 경우 생성자에서 다른 생성자 호출가능 (but, this() 선언 이전에 다른 statement 사용불가)

순서 : this(매개변수) 호출 > 매개변수 형식이 맞는 생성자 찾음 > 인스턴스 초기화 완료

main 함수에서 생성된 thisper과 class내 생성자에서 리턴해준(thisper2) 값과 동일 

 

 Static(정적) 변수  == 클래스 변수

> 공통으로 사용하는 변수가 필요한 경우, 여러 인스턴스가 공유하는 기준값이 필요한 경우

> 인스턴스 생성과 상관 없음, 클래스 이름으로 직접 참조

사용법 ) static 자료형 변수명;

ex) 입사자에게 사번 부여하는 프로그램

static형의 변수는 인스턴스 생성 전 클래스(Employee)명으로 접근하여 출력가능

> static 메서드내에서 인스턴스 변수 사용불가 (생성 전에도 static 변수가 사용가능하므로), 일반 메서드 내에서는 static 변수 사용가능

 

 Singleton패턴 

> 인스턴스가 한개만 생성되어야 하는 디자인 패턴으로 static 변수와 메서드를 활용해 구현가능

> 유일한 객체를 제공할때 구현

방법) class내  private 생성자  /유일한  private 인스턴스  / 인스턴스를 참조할 수 있는  public 메서드  생성

private 클래스명( ) { }

private static 클래스명 instance = new 클래스명();

public static 클래스명 getInstance( ) { return instance; }

 

 배열 

동일한 자료형의 순차적 자료구조로 인덱스로 빠른참조 가능 (인덱스 = 0~length-1)

ArrayList 클래스 사용 多

선언 = 타입[ ] 배열명 = new 타입[크기]    OR    타입 배열명[ ] = new int[크기] 

배열크기 = 타입의 byte * 크기 / length와 요소개수 다를 수 있음

ex)

 

** for (타입 변수 : 배열명){ }

// 배열의 요소를 인덱스0 ~ length-1까지 순차적 순회기능

 

복사

- System.arraycopy( )

: 복사본과 원본의 주소 동일, 배열요소 값 변경시 원본, 복사본 모두 변경

: 얕은 복사(주소복사)

 

 

 

 

 

> 얕은 복사와 깊은 복사

 2차원 배열 

> 선언: 타입[ ] [ ]배열명 = new 타입[행][열]  

> 초기화: 타입[ ] [ ]배열명 = {{#,$,%}, {!.@}}

 

 ArrayList 사용법 

성적 산출 프로그램

 

 

[내일배움카드], [국비지원교육]

 

객체지향 언어 : 객체를 선언한 후, 그 객체에 관한 내용(관계)을 프로그래밍함 => C++, C#, Python, JS, Java

 

Obj 객체란? 구체적, 추상적인 데이터 단위 

객체를 정의하고, 객체가 제공하는 기능을 구현, 그 기능들 간 메시지(파라미터/객체) 전달을 통해 객체간의 관계(협력), 속성을 구현

> 객체를 정의 (class ObjName)

> 객체의 속성을 멤버변수로, 역할을 메서드로 구현

> 객체간의 협력을 구현

ex)

public class UserInfo {

// 멤버변수

String id;

String password;

String name;

String address;

int phone;

}

Funtion 함수란?

스택메모리 : 함수가 호출될때 지역변수들이 사용하는 메모리

하나의 기능을 수행하는 코드로 호출 여러곳에서 가능, 호출하지 않으면 사용되지 않음, 호출시 return하여 반환해줌

ex) 반환타입 함수명 (매개변수) { 코드 }

return 값 없는 함수 = void 타입

return 타입 = 함수 타입

 

return 값을 출력하려면  main함수에서 변수에 담아서 출력가능

변수에 담아주지 않으면 void형인 sayHello 함수 실행결과만 출력된다.

 

지역변수 = res, num1, num2, sum, i

 

 

 

 ※ 메서드와 차이점 

> 함수 : 단독으로 존재

> 메서드 : 객체의 기능으로 클래스 안에 속함, 클래스 안의 멤버변수를 사용하며, 멤버 함수라고도 한다.

 

객체의 속성 = 멤버변수

객체의 기능 = 메서드

 

 

클래스 활용

class 객체A {
    멤버변수, 메서드 선언;  }

class 객체B {
   main 함수 {
      객체A  참조변수 = new 객체A() ; // 인스턴스 생성  
      참조변수.멤버변수 = 값; ...    }
 }

getter 메서드:  변수값을 얻는 메서드

setter 메서드: 변수값을 재설정 하는 메서드

 

객체 A를 B에서 사용할때

> new 키워드를 사용하여 인스턴스를 생성 

> 참조변수(타입 = 객체A) 를 이용하여 멤버변수 or 메서드에 접근, 값 변경 가능함

 

ex)

학생 정보를 출력하는 객체를 생성 (=객체A)                        ->           학생을 만들어줌 (=객체B)

 

인스턴스란?

> new키워드를 통해  클래스를 메모리에 생성한 상태

> 실제 클래스 기반으로 생성된 인스턴스 객체는 각각 다른 멤버변수 값을 가짐

 

힙메모리 (동적메모리)

변수를 사용할때 메모리 할당(new 키워드)  > 사용하지 않으면 할당해제됨

> 메모리 주소 : 참조변수가 가르킴  =>  println(참조변수) // 메모리 주소 출력

> 참조 값: 생성된 인스턴스의 메모리 주소 값

 

생성자란?

> 클래스 이름과 동일, 반환값 없음

> 객체를 생성하기 위해 new키워드 뒤에 오는 것 => 위 코드에서는 StudentInfo 임

> 접근 제어자를 통해 외부에서 접근하지 못하도록 가능

> 클래스에 생성자가 하나도 없는 경우에만 디폴트 생성자가 생김

** 생성자를 생성하고 멤버변수 값을 설정하지 않으면 null, 0으로 할당됨 == 디폴트 생성자

 

ex) 디폴트 생성자 

ex) 클래스에 이미 생성자 존재시

#오류

# 디폴트 생성자 추가

 

생성자 여러개 정의 = 오버로딩

 

 Overriding 

> 상의 클래스에 정의된 메서드내용을 하위 클래스에서 동일한 이름의 메서드로 재정의 하는 것

 

메서드의 이름은 주소값을 나타냄

메서드 내의 변수는 스택 메모리에 위치, 다른 인스턴스라도 같은 메서드 호출

ex)

 다형성 

> 하나의 코드가 여러 자료형으로 구현되어 실행되는 것으로 같은 코드에서 여러 실행결과  출력

> 유연, 확장성있는 프로그램 제작 가능

> 여러 클래스의 하나의 상위 클래스 타입(Animal)으로 핸들링 가능

[내일배움카드], [국비지원교육]

토익 시험 준비하느라 2주차 강의는 별로 듣지 못했다고 한다,,,

그래도 내일배움카드는 잘 사ㅏ용해야지!

 

1/28일  ch1 -14 ~16 (조건문)

 

< if-else문 >

조건이 여러개일때의 if문을 배우고 

학점계산기를 만들어 보았다.

 

90점 이상이면 A

80점 이상이면 B

70점 이상이면 C

그 이하 점수일땐 F를 출력하도록 코드를 짰다.

 

Scanner 함수를 이용해 점수를 입력받았다.

이때 import scanner을 해줘야 한다.

그리고 Scanner 객체를 생성해준다.

 Scanner scanner = new Scanner(System.in); 

 

 

 

 

 

 

< if-if문 > 여러 조건이 존재시 사용한다.

 

if-else문과 다르게 여러 출력이 나올 수 있음

위 코드로 if-if를 사용한다면 grade가 97점일땐 출력이 여러개가 된다.

3개의 if 조건을 만족하기 때문에.

하지만 else문은 조건을 만족하지 않을때만 실행되기 때문에 실행되지 않고

최종출력은 A+ A B 가 출력

grade가 89일땐 B만 출력

 

< switch-case문> 

 

if-else문의 코드를 더 짧게 줄여 가독성을 향상시킬 수 있다.

비교조건이 숫자거나 문자열 등 특정 값으로 나타낼 수 있는 경우 용이하게 사용가능

break 사용시 더 내려가지 않고 바로 switch문을 탈출한다.

 

ex)month 입력시 달의 일 수를 출력해준다.

Java14부터는 쉼표로도 가능, 명령어 여러개 일경우에는 { } 사용하고 리턴값은 yield를 사용한다.

변수 = switch문~~ 으로 사용시 변수 =값 대신 리턴값만 작성시 변수에 바로 리턴된다!!

 

 

1/31일  ch1 -17 ~21 (반복문)

< while문 > 

조건에 만족되면 만족하지 않을때까지 계속 수행

while(조건){ 수행문 } 

< do-while문 >

do { 수행문 } while(조건);

일단 do문을 실행하고 조건에 만족시 while문 수행 => 또 조건 만족시 do문 실행

< for문 >

횟수가 정해질때 편리

for (초기화; 조건; 증감식) { 수행문 }

 

while / do-while / for문 비교

ex) i =0부터 i에 카운트 횟수를 더하는데 카운트가 10이 될 때까지만 반복하는 코드

 

< 중첩반복문 >

너무 많은 반복문 사용시에 시간이 너무 많이 소요된다.

변수를 두개 사용할때 유용하게 사용가능

 

< break-continue문 >

- break : 제어문에서 탈출하는 기능으로 n중 반복문일때는 break가 타이핑 된 반복문 하나에 대해서만 탈출하고 밖에 반복문을 계속 실행

Ex)

 

이때 곱한값이 20보다 크면 break가 걸린다.

그럼 i=1,2일때는 20보다 클 수 없어서 다 출력되고

i가 3일때는 3*6 이후부터는 20이 넘으므로 출력되지 않을것이다.

 

 

 

 

result >

 

[내일배움카드], [국비지원교육]

CAN통신

: broadcast 방식(1:N방식)

: 2가닥으로 구현, 최대1Km 전송거리(50kbps일때)/ 최대속도 1Mbps (전체대역폭의 50%이하 트래픽 유지권장)

: 비동기 통신에서와 같이 NRZ(Non Return to Zero) 코딩 방법사용/ 1비트 동안은 같은 값을 유지

: ECU 간의 통신을 위한 통신

: 매체접근방식 (CSMA/CD 방식) 시간손실없이 우선순위 순서로 메시지 전송

: 중재(arbitration) id경쟁을 통한 이벤트기반 통신 <-> LIN -20Kbps

 

CAN규격 (2.0A > 2.0B 전송가능, 2.0B > 2.0A 전송불가)

  • 표준 형태(2.0A)의 ID= 11bits
  • 확장형태(2.0B)의 ID= 29bits 

ISO규격 (물리계층에서 차이, 통신속도로 구분)

  • ISO 11898 -1Mbps이상의 고속통신  
  • ISO 11519- 125Kbps까지 저속통신

CAN 프로토콜

- 데이터 링크 계층

  • LLC : Acceptance Filtering, Overload Notification, Recovery Management
  • MAC: Data Capsulation/Decapsulation, Frame Coding, Error Detection/Signaling , Serialization/DeSerialization

- 물리계층 (120ohm의 종단저항 처리)

 

Terms

** Dominant(우성) == ‘d’비트 == 0 / Recessive(열성) == ‘r’비트 == 1 

 

- SOF(Start Of Frame) 
: 한 개의 우성 bit 로 구성 Frame의 처음을 지시하고 모든 노드의 동기화를 위해 사용

- Arbitration(중재) ID 
: 메시지 내용 식별 > 우선순위 나타냄/ 11비트(CAN 2.0A버전) or 29비트(CAN 2.0B버전)  

- IDE (Identifier Extension) Bit
: 우성bit => Standard / 열성bit => Extended Frame (프레임 구분)

- RTR (원격 전송 요청) Bit

: 우성 RTR bit => Data Frame/ 열성 RTR bit => Remote Frame (프레임 구분)

- DLC (Data Length Code)

: 0 ~ 8bytes 사이즈

- SRR (Substitute Remote Request) 
: 표준 프레임의 RTR 위치 점유
- CRC (Cyclic Redundancy Code) 
: 16bits 체크섬(checksum) = 15bits  CRC + 열성 구분자(1bit == CRC Del) / 에러 감지에 사용

- ACK (ACKnowledge) Slot
: 전송노드는 열성Bit 송신, 버스에 ACK 비트가 있는지 확인, 없으면 전송 다시 시도

: 수신노드는 오류없으면 우성Bit송신

: 메시지를 올바르게 수신한 모든 CAN 컨트롤러는 메시지 끝에 ACK 비트 전송
- EOF (End of Frame)
: 7개의 ‘r’비트로 구성되어 메시지의 끝을 알리는 목적으로 사용

 

 

(입력) 리모트 프레임 요구 > 송신메일박스 > (응답) 데이터 프레임
##송신 메일 박스가 자동 응답 기능이설정되어 있고 ID가 일치해야 응답

 

Frame Types

  • Data Frame : 데이터 전송하기 위해 구성
  • Remote Frame  데이터 프레임에서 RTR bit == 1 / 데이터 영역 없음 / 데이터를 요구하는데 사용
  • Error Frame : 프레임에 에러 발견시 버스에 전송 / 6~12 dominant bits에러 플래그 + 8 recessive bits 에러경계
  • Overload Frame : 다음 프레임사이에 지연을 위함/ 6-7bits overload 플래그 + 8bit overload 경계

 

< Data Frame >

 

 

▶ Standard(2.0A)

 Arbitration Field = 11bits ID + 1bit RTR

Control Field =  r0 + 4bit DLC

 

▶ Extended(2.0B)

 Arbitration Field

= 11bits ID+ SRR + IDE + 18bits ID + 1bit RTR

Control Field = r1 + r0 + 4bit DLC

 

 

 

 

 

- Arbitration Field
: 11비트 또는 29비트의 크기를 갖는 ID와 1비트의 RTR(Remote Transmission Request) 비트로 구성 
: 둘 이상의 노드에서 메시지의 전송이 동시에 일어날 경우 메시지 간의 충돌을 조정. 
: RTR비트의 값은 데이터 프레임인지(d) 리모트 프레임인지(r)를 결정하는 데 사용

- Control Field
: 2비트의 IDE(IDentifier Extension) 비트, 4비트의 데이터 길이 코드(DLC, Data Length Code)로 구성/ 
: R0은 Reserved 비트(Extended CAN 2.0B R0, R1)

- Data Field
: 0 ~ 8bytes (==DLC 데이터 길이 코드) 의 데이터를 포함/ MSB(Most Significant Bit)부터 송신

: 특정 노드에서 다른 노드로 전송하는 데이터를 포함

- CRC (Cyclic Redundancy Check) Field
: CRC 시퀀스(15Bits) + CRC del(1개 ‘r’ Bit 

: SOF에서부터 데이터 필드까지의 비트열을 이용해 생성 / 메시지 상의 에러 유무를 검사하는데 사용

- ACK (ACKnowledge) Field
: 1bit의 ACK slot + ACK 델리미터(del)

: 노드에서 올바른 메시지를 수신하게 되면 ACK 필드를 받는 순간 ACK 슬롯의 값을 ’d’로 설정해 버스 상에서 계속 전송

 

< Remote Frame >

 SOF, Arbitration/ Control/ CRC/ ACK Field, EOF

: 데이터 영역이 없음 / 데이터 프레임에서 RTR 비트==1
: 데이터를 요구하는데 사용, 리모트 프레임의 요구를 받은 장치는 데이터 프레임으로 응답

<Error Frame>
:  6~12 dominant bits 에러 플래그+ 8 recessive bits 에러경계(에러 종료 상태) 
: 비트 stuffing 규칙을 일부러 손상 시키며, 따라서 현재 전송 중인 장치는 에러로 인해 현재의 프레임이 실패 하였음을 인식하고 즉시 중지하여 다음의 재 전송 기회를 기다림

  • 송신장치에서 발생 에러
    Bit 에러: 보낸 비트와 받은 비트가 서로 다르면 발생
    ACK 에러 : ACK 슬롯 동안 수신 장치가 0을 보내 주지 않을 때 발생.
  • 수신 장치에서 발생 에러
    CRC 에러 : CRC 가 맞지 않을 때 에러 발생 (crc계산결과와 나머지가 동일하지 않을때)
    STUFF 에러 : 스터핑(stuffing) 규칙이 맞지 않을 때 에러 발생
    FORMAT 에러 : CRC Del, ACK Del, EOF의 영역에 0(dominant) 값이 나타날 때 

** Frame Coding : 동일신호 5개이상 연속시 1개의 stuff Bit 전송

 

<Overload Frame> 
EOF | 6-7bit 오버로드 플래그 | 8bit 오버로드경계
: CAN 제어기가 아직 이전 메시지의 처리를 마치지 못한 경우 다음 메시지의 시작을 지연시키기 위해서 사용
: 오버 로드 프레임은 에러카운터 수에 영향X 

1/20일  ch1 -01~09 (자료형)

배운 내용

이클립스 설치

변수, 자료형을 학습했다.

이전에 공부해본 적이 있어서 어렵지 않은 부분이였지만

자료형 범위는 주의 해야 한다.

정수) byte = 8bit, 범위는 -128 ~ +127

정수) int = 4byte로 32비트 내  –2,147,483,648 ~ 2,147,483,647

long = 8byte으로 숫자 뒤에 L을 써줘야 한다.

실수) float 형: 지수부 8bit/ 기수부 23bit

                    : 숫자 뒤에 F를 써서 double형과 구분해준다.

실수) double형: 지수부 11bit/ 기수부 52bit

자바에서 실수는 기본적으로 dobule형

 

같은 숫자여도 둘이 같지 않다.

문자형 char 

아스키코드 A ~ = 65~  단 음수는 대입 할 수 없다.

char ch = A  /    int(ch) = 65System.out.println(ch1);  // A출력
System.out.println((int)ch1); // 65출력

 

 

설치하고 2일 후에 Version 1.8.0_211 of the JVM is not suitable for this product. version: 17 or greater is required.
에러가 발생!!!!!!
> eclipse.ini 파일에서 -Dosgi.requiredJavaVersion=1.8으로 변경
> javaw.exe의 경로를 찾아서ini파일에
-vm
경로~~~~
를 작성해주면 해결 된다.

.

 

1/22일  ch1 -10~13(연산자)

<constant>

constant (상수) 는 변하지 않는 수로 final 예약어를 사용하여 선언한다.

변수명은 대문자로 짓는것을 권장, 가독성이 좋음, 값 변경시 용이

#format : final 자료형 변수명 = 선언

ex) final int MAX_NUM = 100;

 

<literal>

숫자, 문자, 논리값

정수:int / 실수: double, float

상수풀에 있음 (프로그램이 로드되는 순간 메모리를 할당받음)

 

<형 변환>

동일한 타입끼리만 자료유실 없이 정상적으로 연산이 가능 > 형변환 후 동일 타입으로 변경해야함 (더 큰 범위의 형으로)

ex)

double dNum = 3.14;

int iNum_1 = (int)dNum; // int는 정수 이므로 iNum_1은 3이 됨

System.out.println(iNum_1); //3 출력 =>자료유실

=========

int iNum_2 = 225; 

byte bNum_2 = (byte)iNum_2; // byte 범위는 127까지 이므로 들어갈 수 없음

System.out.println(bNum_2); // 강제 캐스팅시 값이 변경되어 다른 값을 출력

<연산자> 

대입 / 부호 / 산술(사칙) /논리 / 증감 / 관계 / 조건 / 비트 연산자

@ 복합대입(다른연산자와 대입연산자가 함께 쓰임)

ex) num1 = num1 + 2   ==  num1+=2         /      num2 = num2 | num1  ==  num2 |= num1

@ 증감 

ex) i=1; res1 = ++i;  =>  res1=2, i =2  /  j=1; res2 = i++;  =>  res2=1, j =2

증감연산자가 앞에 있으면 먼저 증감시킨 후 대입 / 뒤에 있으면 대입 후 증감시킴

@ 관계 : true or false 리턴

System.out.println( i == res1 ); // true

System.out.println( j == res2 ); // false

@ 조건(삼항연산)

if (조건) { true시 결과 }

else {false시 결과}== 조건문 ? true시 결과 : false시 결과

@비트

~: 비트반전(1의보수) / << ,>> : shift 비트 이동 /  ^ : xor  /  |: or  /  &: and

 

 연산자 우선순위 : 일차식 > 단항> 산술> shift > 관계 > 비트연산 > 논리 > 조건 > 대입 

 

+ Recent posts