반응형

1. 연산식에서의 자동 타입 변환

서로 다른 타입의 피연산자가 있을 경우 두 연산자 중 크기가 큰 타입으로 자동변환된 후 연산을 수행한다.

double result = intValue + doubleValue;
//int타입 변수가 double값으로 변환된 후 연산

 

2. 정수 연산일 경우 int 타입을 기본으로 한다.

byte, char, short는 int 타입으로 변환된 후 연사이 수행되며, 연산의 결과도 int 타입이 된다.

 

3. char 타입의 연산 결과는 int 타입으로 산출

char ai = 'A';
int result = ai + 1;
char na = (char) result; // B 임

 

4. 부호 연산자(+, - )의 산출 타입은 int 

short s = 100;
int result = -s;

 

5. 비트 반전 연산자 산출 타입은 int

비트 반전 연산자는 정수타입 (byte, short, int, long)의 피연산자에만 사용됨

byte v1 = 10;
int v2 = ~v1;

 

6. 비트 반전 연산자의 산출값이 1을 더하면 부호가 반대인 정수를 얻을 수 있다.

byte v1 = 10;
int v2 = ~v1 + 1 //-10임

 

7. 산술 연산자 규칙

  • - 피연산자들이 모두 정수타입이고, int 타입(4byte)보다 크기가 작은 타입일 경우 모두 int 타입으로 변환 후 연산을 수행하며, 산출 타입은 int가 됨
  • - 피연산자들이 모두 정수타입이고, long 타입이 있을 경우 모두 long 타입으로 변환 후, 연산을 수행하며, 산출 타입은 long이 됨.
  • - 피연산자 중 실수타입(float, double)이 있을 경우, 크기가 큰 실수 타입으로 변환 후 연산을 수행하며, 연산의 산출 타입은 실수 타입이 됨.
  • ex) int + double -> double + double = double
  • - 즉 연산의 결과를 실수로 얻고 싶다면 피연산자 중 최소한 하나는 실수 타입이어야 한다.

 

int num1 = 10;
int num2 = 4;
int result1 = num1 / num2;		//result1 = 2
double result2 = num1 / num2;		//result2 = 2.0
double result3 = (double) num1 / num2 	//result3 = 2.5
반응형

'코딩 관련 > Java' 카테고리의 다른 글

[JAVA] excel 읽기  (1) 2021.08.23
[JAVA] txt파일 읽기 / 쓰기  (0) 2021.07.13
[JAVA] 변수 헷갈리는 내용 정리  (0) 2021.04.22
[JAVA] linux Shell 명령어 실행  (0) 2021.03.25
[JAVA] 콘솔 출력. System.out  (0) 2021.03.24
반응형

1. 변수 작성 규칙

첫 번째 글자는 문자이거나 '$', '_'이어야 하고 숫자로 시작할 수 없음

첫 문자는 영어 소문자로 시작하되, 다른 단어가 붙을 경우 첫 문자를 대문자로 하는 것이 관례

 

2. 변수값 저장

리터럴 : 소스 코드 내에서 직접 입력 된 값 

상수 : 값을 한 번 저장하면 변경할 수 없는 변수

 

3. 로컬 변수

메소드 블록 내에서 선언된 변수.

메소드 실행이 끝나면 메모리에서 자동으로 없어진다.

 

4. 자바는 기본적으로 정수 연산을 int 타입으로 수행한다.

byte타입 또는 short 타입의 변수를 연산하면 int 타입으로 변환된 후 연산되고, 연산의 결과 역시 int 타입이 됨

 

5. 변수가 저장할 수 있는 값의 범위를 초과해서 값이 저장될 경우 쓰레기값이 변수에 저장됨

ex) byte 변수는 127을 넘어서면 최소값인 -128부터 다시 저장됨

 

6. long 타입의 변수를 초기화 할 때는 정수값 뒤에 'L'을 붙이면 됨

 long var1 = 1000000000000L;

 

7. 자바는 실수 리터럴의 기본 타입을 double로 간주한다.

따라서 실수 리터럴을 float 타입 변수에 저장하려면 리터럴 뒤에 'f'를 붙이면 됨

float var1 = 3.14f;
double var2 = 3.14;

 

8. float 보다 double이 약 두 배의 자릿수가 배정되어 있으므로 더 정밀한 값을 저장할 수 있다.

9. 정수 리터럴에 10의 지수를 나타내는 E 또는 e를 포함하고 있으면 실수 타입 변수에 저장해야 한다.

int var1 = 3000000;
double var2 = 3e6;
float var3 = 3e6f;
double var4 = 2e-3;

 

10. 변수 타입의 최대값 상수와 최소값 상수를 알아보는 함수

기본 타입

최대값 상수

최소값 상수

byte

Byte.MAX_VALUE

Byte.MIN_VALUE

short

Short.MAX_VALUE

Short.MIN_VALUE

int

Integer.MAX_VALUE

Integer.MIN_VALUE

long

Long.MAX_VALUE

Long.MIN_VALUE

float

Float.MAX_VALUE

Float.MIN_VALUE

double

Double.MAX_VALUE

Double.MIN_VALUE

 

11. int 값을 실수 타입으로 안전하게 변환 시키려면 double 타입을 사용할 것.

float : 부호 1비트 + 지수 8비트 + 가수 23비트

double : 부호 1비트 + 지수 11비트 + 가수 52비트

int의 크기는 32비트이므로 double의 가수 52비트 보다 작기때문에 어떠한 int 값이라도 정밀도 손실 없이 double 타입으로 변환될 수 있다. 

int num1= 123456780;
// int 값을 float타입으로 자동변환
float num2 = num1;
//123456780은 23비트로 표현할 수 없기 때문에 근사치로 변환, 정밀도 손실 발생
반응형
반응형
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class App {
    public static void main(String[] args) throws Exception {
        System.out.println("Hello, World!");
        String s;
        Process p;
        try {
        	//이 변수에 명령어를 넣어주면 된다. 
            String[] cmd = {"/bin/sh","-c","ps -ef | grep tomcat"};
            p = Runtime.getRuntime().exec(cmd);
            BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
            while ((s = br.readLine()) != null)
                System.out.println(s);
            p.waitFor();
            System.out.println("exit: " + p.exitValue());
            p.destroy();
        } catch (Exception e) {
        }
    }
}

 

실행할 명령어를 String[] 타입이 아니라

String cmd = "ls -al"; 

처럼 String 으로도 넣을 수 있는데...

명령어에 | 파이프가 들어가는 경우엔... 실행이 안 되었다..

그래서 찾아본 결과.. String[] 을 이용하면 된다고 해서 해보니.. 됐음.. 

String[] cmd = {"/bin/sh","-c","ps -ef | grep tomcat"};

  • /bin/sh -c : 그 뒤에 오는 문자열을 실행하라는 의미 

 


  • 파이프가 들어가는 명령어 실행 관련하여 참조한 링크 
 

How to make pipes work with Runtime.exec()?

Consider the following code: String commandf = "ls /etc | grep release"; try { // Execute the command and wait for it to complete Process child = Runtime.getRuntime().exec(commandf); ...

stackoverflow.com

 

반응형
반응형

System.out : PrintStream 타입의 필드이며 OutputStream타입으로 변환해서 사용할 수 있음

write 메소드들을 이용하여 콘솔에 출력


1. write() 를 사용 

한 문자(1바이트로 표현가능한 숫자, 영어, 특수문자)만 출력 

 


2. write(byte[] b) 나 write(byte[] b, int off, int len) 사용

한글을 출력하려면 우선 한글을 바이트 배열로 얻은 다음, 위처럼 출력하면 된다.


System 클래스의 out 필드는 원래 PrintStream 타입의 필드이므로

PrintStream의 print() 또는 println() 메소드를 사용하면 더 편하다.

이것이 우리가 아는 System.out.println... 

 

반응형

'코딩 관련 > Java' 카테고리의 다른 글

[JAVA] 변수 헷갈리는 내용 정리  (0) 2021.04.22
[JAVA] linux Shell 명령어 실행  (0) 2021.03.25
[JAVA] 콘솔 입력. System.in  (0) 2021.03.24
[JAVA] Writer  (0) 2021.03.24
[JAVA] Reader  (0) 2021.03.21
반응형

System.in : InputStream 타입의 필드

read메소드들로 입력된 값을 읽을 수 있다.


1. read() 를 사용

read()를 사용하면 아무리 입력해도 처음 한 문자(1바이트.. 숫자, 영어, 특문)밖에 못 읽음.. 

한글은 못 읽는다.

read()메소드가 있어야 입력한 키가 표시되는 것 같다...

 


2. read(byte[] b)나 read(byte[] b, int off, int len) 을 사용

  • byte 배열의 길이 지정 시 

영어 한 문자는 1바이트, 한글 한 문자는 2바이트를 차지하는 것 고려해서 지정

 

  • 바이트 배열에 저장된 문자를 String 클래스 생성자를 이용하여 문자열로 변환할 때 길이-2인 까닭 

마지막 두 바이트는 Enter키에 해당하는 13(캐리지리턴), 10(라인피드) 이므로 이를 제외하기 위해.

반응형

'코딩 관련 > Java' 카테고리의 다른 글

[JAVA] linux Shell 명령어 실행  (0) 2021.03.25
[JAVA] 콘솔 출력. System.out  (0) 2021.03.24
[JAVA] Writer  (0) 2021.03.24
[JAVA] Reader  (0) 2021.03.21
[JAVA] OutputStream  (0) 2021.03.21
반응형

Writer : 문자 기반 출력 스트림의 최상위 클래스

<Writer 클래스를 상속받는 클래스>

  • FileWriter
  • BufferedWriter
  • PrintWriter
  • OutputStreamWriter

1. write(int c)

한 문자씩 출력

write 메소드 사용 후 

flush()나 close() 를 해야 정상적으로 파일에 출력이 된다.

OutputStream은 close()를 안 해도 출력이 되던데 

왜 그런건지 잘 모르겠다.


2. write(char[] cbuf)

char[] 배열의 모든 문자를 출력


3. write(char[] c, int off, int len)

c[off] 부터 len개의 문자를 출력


4. write(String str)


5. write(String str, int off, int len)


 

writer 사용시엔 꼭 flush와 close를 사용하자.... 

반응형
반응형

Reader : 문자 기반 입력 스트림의 최상위 클래스

<Reader 클래스를 상속받는 클래스>

  • FileReader
  • BufferedReader
  • InputStreamReader

test.txt file 내용

ABCD


1. read()

입력 스트림으로부터 한 개의 문자를 읽고 int 타입으로 리턴한다.

리턴한 int 값을 char 타입으로 변환하면 읽은 문자를 얻을 수 있다. 

읽을 게 없으면 -1을 반환함.


2. read(char[] cbuf)

매개값으로 주어진 문자 배열의 길이만큼 문자를 읽고 배열에 저장

읽은 문자 수를 리턴함.

많은 양의 문자를 읽을 때는 이 메소드를 사용하면 좋다.

읽을 게 없으면 -1을 반환함


3. read(char[] cbuf, int off, int len)

입력 스트림으로부터 len개의 문자만큼 읽고 매개값으로 주어진 문자배열 cbuf[off]부터 len개까지 저장한다. 

읽은 문자 수를 리턴함.

읽을 게 없으면 -1을 반환함


close()

reader를 더이상 사용하지 않을 경우에 close()를  호출해서 

reader에서 사용했던 시스템 자원을 풀어준다.

반응형
반응형

OuteputStream : 바이트 기반 출력 스트림의 최상위 클래스

<OutputStream을 상속하는 클래스>

  • FileOutputStream
  • PrintStream
  • BufferedOutputStream
  • DataOutputStream

 

1. write(int b) 

한 글자씩 출력 스트림으로 내보냄

 

print로 찍어본 byte값은 이렇게 나온다

파일에 출력된 값은 문자하나하나씩 출력됨

 


2. write(byte[] b)

인자의 모든 바이트를 출력 스트림으로 내보낸다. 

출력 결과

한번에 쭉 출력


3. write(byte[] b, int off, int len)

off부터 lent개의 바이트를 출력 스트림으로 내보냄

출력 결과

[1]과[2] 


flush()

버퍼에 잔류하고 있는 데이터를 모두 출력시키고 버퍼를 비움.

close() 

OutputStream에서 사용했던 시스템 자원을 풀어줌.

반응형
반응형

css 먹히지도 않는 itext5버전으로 열심히 삽질하다가ㅠ ㅠ 

itext7버전으로 광명찾고 성공한 썰. css 다 잘 먹는다 ㅠ ㅠ 흑흑

환경 : VS Code / Spring boot / gradle 사용 

 


1. 필요한 라이브러리 다운로드 

  •  itext7 라이브러리

다운로드 링크

 

Releases · itext/itext7

iText 7 for Java represents the next level of SDKs for developers that want to take advantage of the benefits PDF can bring. Equipped with a better document engine, high and low-level programming c...

github.com

iText7-Core-7.1.14-only-jars.zip 을 받았다.

  •  html2pdf 
 

Maven Repository: com.itextpdf » html2pdf » 3.0.3

pdfHTML is an iText 7 add-on that lets you to parse (X)HTML snippets and the associated CSS and converts them to PDF. com.itextpdf html2pdf 3.0.3 // https://mvnrepository.com/artifact/com.itextpdf/html2pdf implementation group: 'com.itextpdf', name: 'html2

mvnrepository.com

html2pdf-3.0.3.zip 를 받았다.

 

  • (한글 폰트)

한글 텍스트가 포함되어있는 경우 한글 표시를 위해 한글 폰트가 필요하다.

ttf파일은 검색하면 쉽게 구할 수 있음!

사용한 폰트는 맑은고딕임.

 

 


2. 라이브러리 적용(build.gradle)

libs 폴더에 다운받은 jar 파일을 넣고 build.gradle에 명시


3.  A ) html을 String으로 넘기는 경우 

//import 리스트 참고. itext7 은 com.itext.pdf.text나 tool이 아니다.
import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.FontProgram;
import com.itextpdf.io.font.FontProgramFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.IBlockElement;
import com.itextpdf.layout.element.IElement;
import com.itextpdf.layout.font.FontProvider;



//BODY : html string , dest : pdf를 만들 경로(D:\\sample.pdf)
public void makepdf(String BODY, String dest) throws IOException {
    //한국어를 표시하기 위해 폰트 적용 
    String FONT = "D:\\malgun.ttf";
    //ConverterProperties : htmlconverter의 property를 지정하는 메소드인듯
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    FontProgram fontProgram = FontProgramFactory.createFont(FONT);
    fontProvider.addFont(fontProgram);
    properties.setFontProvider(fontProvider);

    //pdf 페이지 크기를 조정
    List<IElement> elements = HtmlConverter.convertToElements(BODY, properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    //setMargins 매개변수순서 : 상, 우, 하, 좌
    document.setMargins(50, 0, 50, 0);
    for (IElement element : elements) {
      document.add((IBlockElement) element);
    }
    document.close();
}

 


반응형

3.  B) html을 파일로 넘기는 경우

//src : html파일 경로("D:\\sample.html") , dest : pdf를 만들 경로("D:\\sample.pdf")
public void makepdf(String src, String dest) throws IOException {
    //한국어를 표시하기 위해 폰트 적용 
    String FONT = "D:\\malgun.ttf";
    //ConverterProperties : htmlconverter의 property를 지정하는 메소드인듯
    ConverterProperties properties = new ConverterProperties();
    FontProvider fontProvider = new DefaultFontProvider(false, false, false);
    FontProgram fontProgram = FontProgramFactory.createFont(FONT);
    fontProvider.addFont(fontProgram);
    properties.setFontProvider(fontProvider);

    //pdf 페이지 크기를 조정. convertToElements의 매개변수 부분만 다름.
    List<IElement> elements = HtmlConverter.convertToElements(new FileInputStream(src), properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    //setMargins 매개변수순서 : 상, 우, 하, 좌
    document.setMargins(50, 0, 50, 0);
    for (IElement element : elements) {
       document.add((IBlockElement) element);
    }
    document.close();
}

string인 경우랑 거의 똑같음.ㅎㅎ 


아무 옵션 안 주고 ... 텍스트만 덜렁 변환하는 거면 사실

public void createPdf(String html, String dest) throws IOException {
    HtmlConverter.convertToPdf(html, new FileOutputStream(dest));
}

요 소스만으로도  변환이 된다

근데 한국어 표시도 해야되고... 크기도 조절해야 하니까.. ㅎㅎ


변환했던 html 예제

html 소스를 string으로 작성하여 이용함

StringBuilder body = new StringBuilder();
 
String header = "<!DOCTYPE html>" + "<html lang='ko-KR'>" + "<head>" + "<titlet>test</title>"
                + "	<meta charset='UTF-8'/>" + "	<meta name='description' content='Free Web tutorials'/>"
                + "	<meta name='keywords' content='HTML,CSS,XML,JavaScript'/>"
                + "	<meta name='viewport' content='width=device-width, initial-scale=1.0'/>"
                + "	<meta http-equiv='X-UA-Compatible' content='IE=Edge'/>"
                + "<script src='https://use.fontawesome.com/releases/v5.2.0/js/all.js'></script>" + "</head>";
                
String middle = "<body style='margin:auto; padding: 0;'>"
                + "	<div class='logo' style='width: 780px;height: 40px;padding: 10px; margin: auto;'>"
                + "		<a href='#' style='color: #000000;text-decoration: none;'><img src='img/logo.png' alt='로고'/></a>"
                + "	</div>";

String footer = "	<div class='footer' style='width: 780px;height: 60px;padding: 20px;text-align: center;font-size: 0.75em; margin: auto;'>"
                + "	본 메일은 발신전용 입니다. 자세한 사항은 홈페이지를 확인해 주시기 바랍니다.	" + "	</div>" + "</body>" + "</html>";
                
body.append(header);
body.append(middle);
body.append(footer);

String BODY = body.toString();

// html to pdf
makepdf(BODY, today);

 


 

 

참고한 페이지

 

  • itext7 기본 사용법 참고
 

Chapter 1: Hello HTML to PDF

 

kb.itextpdf.com

  • margin 세팅 관련
 

iText 7 can not set margin

I have an HTML string, i need to convert it to pdf, but pdf that i need must have specific size and margin. I did as the example show, now i have pdf with width and height that i set, BUT i can`t c...

stackoverflow.com

  • itext 구버전으로 구현한 소스 참고
 

iText 로 html에서 pdf 만들기

코드를 약간 수정 하였습니다.다음의 궁금한 점에 대해서 자 답을 하지 못했습니다.복잡한 css 파일의 경우...

blog.naver.com

 

반응형
반응형

InputStream : 바이트 기반 입력 스트림의 최상위 클래스<InputStream을 상속받는 클래스>

  • FileInputStream
  • BufferedInputStream
  • DataInputStream

테스트파일 text.txt 내용 

a1b2c3


1. read() 메소드 

InputStream.read()

1바이트씩 읽고 int 타입으로 리턴한다.

이게 무슨말인가 봤더니 아스키코드로 반환하는 거였음

읽을 게 없으면 -1을 반환함


2. read(byte[] b) 메소드

InputStream.read(byte[])

byte배열 타입을 매개값으로 받아서 배열 길이만큼 바이트를 읽고 배열에 저장한다.

읽은 바이트 수를 리턴함

읽을 게 없으면 -1을 반환함


3. read(byte[], int off, int len) 메소드 

InputStream.(byte[] , int , int ) 

입력스트림으로부터 len개의 바이트만큼 읽고, 매개값으로 주어진 바이트배열 byte[off]부터 len개를 저장한다.

읽은 바이트 수를 리턴함

 

읽을 게 없으면 -1을 반환함

재밌네

반응형

+ Recent posts