반응형

◎ 객체

▼ 객체 지향 프로그램의 대상 , 생성된 인스턴스

◎ 클래스

▼ 객체를 프로그래밍 하기위해 코드로 만든 상태

◎ 인스턴스

▼ 클래스가 메모리에 생성된 상태

◎ 멤버 변수

▼ 클래스의 속성, 특성

◎ 메서드

▼ 멤버 변수를 이용하여 클래스의 기능을 구현

◎ 참조변수

▼ 메모리에 생성된 인스턴스를 가리키는 변수

◎ 참조 값

▼ 생성된 인스턴스의 메모리 주소값

StudentTest.java 에서
Student studentLee = new Student();  // 인스턴스 : 생성과 동시에 자바 heap memory에 할당
//studentLee 는 참조변수이다 student.java의 인스턴스를 참조하고 있기 때문이다.
System.out.println(studentLee);
//이렇게 studentLee 를 출력하면 student.java의 참조값이 출력된다
//(ex: classpart.Student@a23d95)

Student.java 에서
 public int studentID;
 public String studentName;
 public String address;
//위 변수들을 멤버변수라고 한다

 public void showStudentInfo(){
}
//위의 것을 student.java 클래스의 메서드 라고 한다.

◎ Stack

▼ main에 작성한 변수등등 코드들은 stack 에 차례대로 쌓엿다가 제 할 일을 다하면 다시 없어지는 그런 구조이다. 먼저 작성한 변수들이 차례대로 쌓엿다가 젤 나중에 쌓인 애들이 먼저 없어지는 그런....(선입후출)

◎ HeapMemory

▼ JVM (자바 버츄얼 머신)이 가지고있는 가상 메모리이다. 인스턴스들이 쌓이져 주로 NEW 생성자를 사용하면 Heap memory에 쌓인다. 하지만 메서드 들은 heammemory 가 아닌 다른 곳에 있다.

◎ 그림 설명

▼ main 에서 Student studentLee = new student(); 를 하였을경우

student.java의 student 인스턴스가 heap 메모리에 적재되고

studentLee 는 heap 메모리에 적재된 student 인스턴스를 가르키고있는 참조 변수가된다.

하여 student.java의 멤버변수들을 studentLee.studentId 등으로 호출을 할 수 있는것이다.

studentKim 도 똑같다.

◎ 가비지콜렉션

▼ 자바에는 가바지콜렉션이라고 복잡한 알고리즘으로 쌓인 클래스가있는데 이놈이 주기적으로 HEAP MEMORY에 적재된 놈들을 사용하지않으면 다시 메모리를 반환하는 그런 편리한 역할을 한다. 이건 자바의 장점이다 C나 C++에는 없는..

◎ 변수의 생성과 메모리

반응형

'프로그래밍 > Java' 카테고리의 다른 글

[JAVA] 리터럴과 형변환  (0) 2022.01.04
Java - 라운드 로빈 (Round Robin) 예제  (0) 2019.05.29
반응형



▼ 환경

eGovFrame 3.1 (전자정부프레임워크버전)

spring 3.2.9 release

egov 3.0.0 version

mod-socket-io 1.0.2 < -- 이건 머하는놈인질 모르겟음

◎ XML 설정

▼ 내용

먼저 전자정부에는 context-transaction.xml 이란 xml 파일이 있을꺼다 여기에 tx:advice 와 aop를 설정해주면 된다 .



context-transaction.xml

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="*" rollback-for="Exception"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="requiredTx" expression="execution(* org.egovframework.karico..impl.*Impl.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" /> </aop:config> </beans>

◎ JAVA에 작성하기

▼ 내용

XML을 설정하였으면 트랜잭션을 걸 메소드에 아래와 같이 작성하면된다.

본인은 컨트롤러에 작성하였다 컨트롤러 안에는 INSERT문을 실행하는 SERVICE들이 한 4~5개 된다. 만약 아래의 commit 나 rollback 를 안써놓으면 그냥 트랜잭션이 잡혀있는상태로 된다.

톰캣을끄면 그트랜잭션은 사라지고 rollback 되는거같더라.

어쩃든 이렇게 작성해놓으면 commit이나 rollback 둘중 하나가 되기 전까지 디비에 써지진 않는다.

RESTfullReportController.java

@Controller public class RESTfullReportController { @Resource(name = "txManager") protected DataSourceTransactionManager txManager; @RequestMapping("/api/saveInitialCheckReport") public ModelAndView saveInitialCheckReport (HttpServletRequest request, HttpServletResponse response) throws Exception { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); TransactionStatus txStatus = txManager.getTransaction(def); try { ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ 각종 INSERT UPDATE 등 DB 문 ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ txManager.commit(txStatus); //정상일경우 COMMIT; model.put("result", 0); } catch (Exception e) { e.printStackTrace(); txManager.rollback(txStatus); //에러날경우 CATCH로 빠져서 ROLLBACK; model.put("result", -1); } }


◎ 위에처럼만 하면 끝 생각보다 쉽다..


반응형
반응형


Spring - 프로젝트 한글깨짐 설정


◎ 이클립스 UTF-8 설정

STS(스프링) 에서 한글이 깨지는 이유는 기본 인코딩이 MS949로 되어 있어서 한글이 깨진다.

인코딩을 모두 UTF-8로 변경을 해주어야 한글이 깨지지 않는다.

먼저 Window - Preferences 로 들어가준다.


CSS, HTML, JSP 항목에서 Encoding 항목을 ISO 10646/Unicode(UTF-8)로 변경해 준다.


General -> Workspace의 Text file encoiding 을 UTF-8로 바꿔준다.


◎ 이클립스 웹브라우저 설정

▼ General -> Web Brower에서 New를 누른후 Chrome을 설정한다.


◎ XML UTF-8 설정

▼프로젝트내 web.xml 안에 아래 내용 추가

<web-app> 태그 안에 Servlet-mapping 태그 밑에 추가하면된다

<!-- 한글깨짐 방지 --> <!-- filter와 filter-mapping을 만들어 준다. --> <filter> <!-- filter안에는 filter-name, filter-class, init-param을 추가해 준다. filter-name은 원하는대로 지정해도됨 --> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <!-- encoidng값을 UTF-8로 만들어 준다. --> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

◎ JSP UTF-8 설정

▼ 맨위 <%@ UTF-8 설정과 META 태그의 UTF-8 설정을 해주면된다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page session="false" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Home</title> </head> <body> <h1> Hello world! </h1> <P> The time on the server is ${serverTime}. </P> </body> </html>


반응형
반응형

◎ 라운드로빈 자바예제 파일

▼ 쓰레드를 만들고 작업시간 분할시간을 정해서 출력해서 보여주게끔 간단하게 잔 예제이다.

package javaSchedule; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Round_Robin { // WT (Wait Time) : 기다린 시간 // TT (Total Time ) : 총 걸린 시간 public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Time Quantum 시분할시간을 정하세요(숫자입력): "); int q = Integer.parseInt(br.readLine()); System.out.println("작업할 프로세스의 수를 정하세요 (숫자입력): "); int n = Integer.parseInt(br.readLine()); int proc[][] = new int[n + 1][4];//proc[][0] AT array, [][1] - RT , [][2] - WT , [][3] - TT for(int i = 1; i <= n; i++) { System.out.println(i + " 번쨰 프로세스의 작업시간은? (Burst Time) (숫자입력): "); proc[i][1] = Integer.parseInt(br.readLine()); } System.out.println(); //total_time 계산 및 time_chart 배열 초기화 int total_time = 0; for(int i = 1; i <= n; i++) { total_time += proc[i][1]; } int time_chart[] = new int[total_time]; int sel_proc = 1; int current_q = 0; for(int i = 0; i < total_time; i++) { //선택한 프로세스를 time_chart의 현재 시간에 할당 time_chart[i] = sel_proc; //1 단위 시간당 CPU가 할당되었으므로 선택한 프로세스의 남은 시간을 1 씩 감소시킵니다. proc[sel_proc][1]--; //WT 와 TT 산출 for문 for(int j = 1; j <= n; j++) { if(proc[j][1] != 0) { proc[j][3]++;//만약 프로세스 실행이 완료되지 않은 경우 TT는 1씩 증가함 if(j != sel_proc)//프로세스가 현재 CPU에 할당되지 않은 경우 WT는 1씩 증가함 proc[j][2]++; } else if(j == sel_proc)//이는 프로세스에 CPU가 할당되어 실행이 완료된 특수한 경우 proc[j][3]++; } //Time_Chart 출력 if(i != 0) { if(sel_proc != time_chart[i - 1]) //CPU가 다른 프로세스에 할당된 경우 현재 시간 값과 새 프로세스의 이름을 프린트 { System.out.print("--" + i + "--P" + sel_proc); } } else//현재 시간이 0인 경우, 즉 인쇄가 막 시작되면 첫 번째 선택된 프로세스의 이름을 프린트 System.out.print(i + "--P" + sel_proc); if(i == total_time - 1)//모든 프로세스 이름이 인쇄되었으므로 실행이 끝나는 시간을 프린트 System.out.print("--" + (i + 1)); //다음 번 반복을 위해 sel_proc 값 업데이트 current_q++; if(current_q == q || proc[sel_proc][1] == 0)//시간이 만료되었거나 현재 프로세스가 실행이 완료된경우 { current_q = 0; //sel_proc에 대해 다음 유효한 값을 선택 for(int j = 1; j <= n; j++) { sel_proc++; if(sel_proc == (n + 1)) sel_proc = 1; if(proc[sel_proc][1] != 0) break; } } } System.out.println(); System.out.println(); //각 프로세스의 WT 및 TT 인쇄 System.out.println("P\t WT \t TT "); for(int i = 1; i <= n; i++) { System.out.printf("%d\t%3dms\t%3dms",i,proc[i][2],proc[i][3]); System.out.println(); } System.out.println(); //WT & TT 평균시간 인쇄 float WT = 0,TT = 0; for(int i = 1; i <= n; i++) { WT += proc[i][2]; TT += proc[i][3]; } WT /= n; TT /= n; System.out.println("The Average WT is: " + WT + "ms"); System.out.println("The Average TT is: " + TT + "ms"); } }


반응형

'프로그래밍 > Java' 카테고리의 다른 글

[JAVA] 리터럴과 형변환  (0) 2022.01.04
JAVA - 인스턴스, 힙 메모리  (1) 2022.01.01
반응형





◎ => (애로우 함수)

▼ 내용

ECMA6 들어서면서 => 애로우 함수를 사용할수 있따.

const handleListening = () =>{ console.log('ㅎㅇ'); } // 위에 는 const handleListening = function () { console.log('ㅎㅇ'); } //이거랑 같다

◎ import , export

▼ 내용

import 문은 외부 모듈이나 다른 스크립트 등으로부터 export 된 기능을 가져오는데 사용됩니다.

(함수,변수 모듈화 class화?)

자바스크립트는 호이스팅이 되는 관계로 변수나 함수가 전역에서 사용할 수 있었기 때문에 이름으로 충돌을 일으키는 경우가 많아서 이용하기 어려웠다. (CommonJS로 사용할 수는 있었음)

ES6부터는 모듈 시스템을 사용할 수 있게 만들었다.

하지만 브라우저에서 지원이 되지 않고있기때문에 webpack같은 모듈 번들러를 사용해야만 모듈시스템(import, export)을 사용할 수 있다.

문법.. import name from "module-name"; import * as name from "module-name"; import { member } from "module-name"; import { member as alias } from "module-name"; import { member1 , member2 } from "module-name"; import { member1 , member2 as alias2 , [...] } from "module-name"; import defaultMember, { member [ , [...] ] } from "module-name"; import defaultMember, * as alias from "module-name"; import defaultMember from "module-name"; import "module-name";

export const pi = Math.PI; export function square(x) { return x * x; } export class Person { constructor(name) { this.name = name; } }

export 키워드로 변수, 함수, 클래스를 외부의 스크립트로 모듈화 시킬 수 있다.

외부로 보내고 싶은 것들에 일일이 키워드를 붙여도 되고 아래처럼 한번에 export해도된다.

const pi = Math.PI; function square(x) { return x * x; } class Person { constructor(name) { this.name = name; } } export { pi, square, Person };
import {userRouter} from "./router"; //export const userRouter = express.Router(); import app from "./app"; //export default app;

또한 export default app; 이렇게 할경우엔 바로 import app 할수 있지만

(export default 파일명 한다는건 안에있는 모든걸 export 해준다는것)

export const userRouter 이렇게 할경우엔 가져올때 {} 를 붙혀서 써줘야한다.

// main.js import { pi, square, Person } from './lib'; console.log(pi); // 3.141592653589793 console.log(square(10)); // 100 console.log(new Person('Lee')); // Person { name: 'Lee' }

반대로 가져오는 방법은 위와 같이 "import" 키워드를 사용하고 from 으로 해당 모듈의 js파일을 가리키면 된다.

import * as lib from './lib'; console.log(lib.pi); // 3.141592653589793 console.log(lib.square(10)); // 100 console.log(new lib.Person('Lee')); // Person { name: 'Lee' }

위와 같이 "as"를 사용해서 일일이 모듈을 불러오지 않고 한번에 사용할 수 있다.


◎ 구조 분해 할당 ( destructuring assignment )

▼ 내용

객체 또는 배열을 소인수분해 하듯이 분해하여 할당할수 있다.

const searchingBy = req.query.term //기존방식 const { query: {term : searchingBy} //req.query.term 의값을 searchingBy 할당 } = req;

솔직히 이걸 작성하면서 대략적인 느낌만 이해가간다.. 하지만 왜 구지 보기힘들게 이렇게쓰나 싶다.. 나중에 이해더가면 추후작성하기로하고 mdn 주소를 남긴다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

새로운 변수 이름에 할당

객체 구조분해를 사용하여 새로운 변수 이름에 값을 할당할 수 있습니다.

var o = {p: 42, q: true}; var {p: foo, q: bar} = o; console.log(foo); // 42 console.log(bar); // true






반응형

+ Recent posts