일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 아웃풋법칙
- 히든 스토리
- try width resources
- 월칙
- 수부타이
- 참조 계수
- docker
- apache kafka
- try-with-resources
- ESG
- 칭기즈칸의 위대한 장군 수부타이
- 부자의그릇
- 레퍼런스 복사
- kubernetes
- 과제의 분리
- 쿠버네티스
- Container
- 공헌감
- colllection
- HTML
- 모두가 기다리는 사람
- node
- 이펙티브 자바
- 도파민형 인간
- 비메모리 자원
- java
- Infresh
- sentry
- 뉴 컨피던스
- CSS
- Today
- Total
목록Programming/Java (38)
Hi
Project(Solution) - Module(Project): Protobuf User 객체 -> File, Network 직렬화 java -> binary gson -> JSON User 객체가 직렬화를 지원하게 하기 위해서는 인터페이스 하나만 구현하면 됩니다. 객체 직렬화/역직렬화 방법 1) JSON: Gson => Text 형식 { "name": "Tom", "age": 42 } 2) Binary : 효율적으로 저장할 수 있다. => Google Protocol Buffers 1) 효율적이다. 2) 다양한 언어에 코드를 직접 작성할 필요가 없다. protoc를 이용해서 생성하면 된다. 3) 타입이 명확하게 지정되어야 한다. '타입 안정성'이 있다. Server: Java, Python, Node..
1. uml diagram 2. (login) sequence diagram 2가지 형태의 설계를 한다.
http://yookeun.github.io/java/2017/05/27/java-gson/
// 직렬화(Serialization) // : 객체를 저장하거나 전송하기 위해 바이너리 또는 텍스트 형식으로 변환하는 것 // 역직렬화(Deserialization) // : 바이너리 또는 텍스트 형식의 데이터를 객체로 복원하는 과정 // Java - Serializable(interface) : Java // 데이터 교환 포맷 // 1) Text: JSON, XML // Object -> JSON : Google Gson Library // 2) Binary // 직접 프로토콜을 설계 // 3) Protocol Buffers /* { "type": "Join", "body": { "user": "Tom" } } // JSON String String Number(Int, Double, Float, C..
parameter에 넣어서 가져오는 것은 똑같은 레퍼런스를 가리키는 것이고, 얕은복사와는 개념이 다르다. 얕은복사를 하면 ConcurrentModificationException을 피할 수 있다.
Thread.sleep(3000); // 최근에는 아래를 많이 쓴다. Java8부터TimeUnit.SECONDS.sleep(3);
CopyOnWriteArrayList : ArrayList에 여러 스레드가 접근하여, Concurrent Modification Exception을 일으키게 되는데 이때 ArrayList 자체를 동기화 시켜주는 것 volatile : 메모리 접근시, 최적화 되어있으면 캐시에서 데이터가 저장되기 때문에, 메모리까지 내보내지 않기 때문에 멀티쓰레드시 오류 가능성이 있다. 이 때 최적화를 하지 않기 위한 키워드이다.
[Linux - Ubuntu] CLI - 커맨드 라인 인터페이스 C 언어 - 컴퓨터 구조 / OS System Programming / Network Programmming [IDE - IntelliJ] Java - GUI - 그래픽 유져 인터페이스 객체 지향 프로그래밍 디자인 패턴 - 23가지 (에릭감마 외 3명) ----------------------------- Mobile App(Android(Kotlin) / iOS(ObjC / Swift)) Web Client(HTML/CSS/Javascript/Node.Js) Game Prorgramming(Unity, C#) Server Programming(Node.js / Go / Docker) OS(운영체제) : 목적? 자원 관리 물리적 자원 - C..
package io.thethelab; // Main.java // => 이 파일안에 Main 이라는 클래스가 존재합니다. // 파일의 맨 첫 라인에는 해당 클래스가 포함되어 있는 패키지를 선언해야 합니다. // => io.thethelab.Main 이라는 이름으로 해석됩니다. // Package // 목적: 이름 충돌을 방지하기 위해서 사용합니다. // 사용방법 // 1) 회사(소속)의 도메인을 거꾸로 사용한다. // 2) 모두 소문자로 작성한다. // struct User { // char* name; // 구조체 멤버 변수 // }; // 함수 // void init_name(struct User* user) // { // strcpy(user->name, "Unnamed"); // } // cla..
스택을 만들어보자 package io.thethelab; // C 의 타입 // 1) built-in type // int, char, double, float, short, long ... // 2) user defined type // struct, union, enum // 3) call by value // call by reference // => pointer // 4) const // Java 의 타입 // 1) primitive type // int, char, double, byte, boolean // => call by value // 2) reference type // Array, class, interface, enum // => call by reference // => 힙에 ..
package io.thethelab; // 접근 지정자 // public // protected // private // 정보 은닉 // : 클래스의 속성이 연산을 통해서만 변화될 수 있도록 // 제어할 수 있다. // 에러의 전파 // => 예외(Exception) public class Stack { private static final int STACK_SIZE = 10; private int top; private int[] data; Stack() { top = 0; data = new int[STACK_SIZE]; } void push(int n) { if (top == STACK_SIZE) { throw new RuntimeException("stack overflow"); } data[t..
스택을 만들어보자 public class User { String name; int age; // void init() { // name = "Unnamed"; // age = 0; // } // 생성자: 객체가 생성된 이후에 호출되는 함수. // => 객체의 초기화를 담당한다. // 인자가 없는 생성자: 기본 생성자 User() { System.out.println("User()"); name = "Unnamed"; age = 0; } // 인자가 있는 생성자 // this(self): 자기 자신을 가르키는 레퍼런스 User(String name, int age) { this.name = name; this.age = age; } void print() { System.out.printf("%s %d"..
스택을 만들어보자 package io.thethelab; // 1. 내부의 필드는 반드시 private 으로 만드는 것이 // 좋다. // 2. 필드의 속성은 메소드를 통해 변경하는 것이 좋다. class Printer { private String printerName; public void setName(String name) { this.printerName = name; } public void print() {} } class User { String name; int age; void foo() { Printer printer = new Printer(); // printer.name = "Hello"; printer.setName("Hello"); } } public class Program..
package io.thethelab; // 상속 // 다형성 // 오버라이딩 // 인터페이스 class Color { private int red; private int green; private int blue; // RED, GREEN, BLUE, BLACK, CYAN private Color(int red, int green, int blue) { this.red = red; this.green = green; this.blue = blue; } static Color rgb(int red, int green, int blue) { return new Color(red, green, blue); } static Color hsb(int hue, int saturation, int brightnes..
C - Windows API Linux - Gnome ToolKit C++ Linux - Qt(KDE) Java Swing / SWT / AWT / ... => Java FX ---------------------------- Processing - GUI Framework C(dll/so) / Java(jar) Platform - 기반 환경 '언어', '운영체제', .... Library - 클래스 / 함수 / 도구의 집합 Engine - 라이브러리 집합 Framework - 라이브러리 집합 법칙 / 흐름 XML + C# XML + Java HTML + javascript
스택을 만들어보자 class User { private String name; // 인스턴스 필드 private int age; private static int a; // 정적 필드(클래스 필드) // class Printer { static class Printer { void print(User user) { System.out.println("User.Printer.print()"); System.out.println(user.name); } } void print() { Printer printer = new Printer(); printer.print(this); } } // interface - Cloneable // => mark up interface class Point implemen..
스택을 만들어보자 class User { // 1. 상수 public static final int STATE_RUNNING = 0; public static final int STATE_STOP = 1; public static final int STATE_INTERRUPTABLE = 2; // 문제점 // 1. 잘못된 값을 대입하였을 경우, 컴파일 타임에 감지가 어렵다. // 2. switch / else if 의 코드가 발생한다. // => Enum private int state = STATE_STOP; void process() { switch (state) { case STATE_RUNNING: System.out.println("User running"); break; case STATE_S..
스택을 만들어보자 // FILE Stream // Network Stream // => InputStream // => OutputStream import org.junit.Test; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; public class Program_0308 { public static final String SRC_PATH = "/Users/..
import org.junit.Test; // 1. interface(행위) / abstract(상태) // 2. interface 장점 // LinkedList l = new LinkedList(); // List l = new LinkedList(); // => 교체 가능한 유연한 설계 // 3. Abstract class 에도 구현을 제공할 수 있다. // DIP: 클라이언트는 구체적인 타입보다는 인터페이스나 추상 // 클래스에 의존해야 한다. // 4. 예외 // : 실패를 전달하는 방법 // 5. Interface // 익명의 클래스 // => 함수 포인터 // => : 함수를 별도의 레퍼런스에 저장할 수 없다. // => 함수를 일급 객체로 취급하지 않는다. // Java 8 -> 메소드 레퍼..
스택을 만들어보자 import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; // 오직 한개의 메소드만 가지는 인터페이스 @FunctionalInterface interface Predicate { boolean test(User user); // boolean foo(); } // staic 함수를 모아놓은 클래스 final class Users { // private 생성자: 객체의 생성을 금지 private Users() { } static List filter(List users, Predicate predicate) { List result = new Ar..
import org.junit.Test; import java.util.*; import java.util.function.Function; // 아래 코드의 문제점 3개 // Object[] data = new Object[10]; // => 클래스 계층의 시작. // 모든 객체가 가져야 하는 특징 // 부모의 참조 변수는 자식의 객체를 참조할 수 있다. - Upcasting // 1. list.add(new Integer(5)); // -> wrapper class // => 원시 타입을 객체로 다룰 필요가 있기 때문에 // list.add(5); // -> list.add(Integer.valueOf(5)); // 2. Generic 이 아니다. // : Java5 - Auto Boxing // A..
스택을 만들어보자 import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; // User를 정렬 가능하게 만들고 싶다. // 1. Comparable 인터페이스를 구현해야 한다. // class User implements Comparable { class User { private String name; private int age; String getName() { return name; } int getAge() { return age; } User(String name, int age) { this.name = name; this.age = age; } @Overr..
hashCode / equals 객체의 동등성에 판단에 사용되는 메소드 스택을 만들어보자 import java.util.*; class User implements Comparable { // class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + ..
스택을 만들어보자 package io.thethelab.data; import java.lang.reflect.Method; // Reflection의 문제점 // : 잘못 사용한 경우, 성능이 느리다. class User { private String name; private int age; public User() { this("Unnamed", 0); } public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "U..
a : Data b = a // copy 복사 정책 2가지 1. 레퍼런스 복사(얕은 복사) * 장점: 속도가 빠르고, 메모리도 덜 쓴다. * 단점: 객체의 파괴 시점을 결정할 수 없다. => 댕글링 포인터 해결방법: 참조 계수에 의한 객체 수명 관리 2. 값 복사(깊은 복사) * 장점: 객체의 파괴 시점을 결정할 필요가 없다. * 단점: 데이터의 크기가 클 수록 속도가 느려지고, 그만큼의 메모리도 소모해야 한다. Reference Counting => 참조 계수 객체의 생성과 소멸 => StringBuilder - 문자열이 수정될 때마다 객체의 생성을 만드는 것을 방지 Integer.valueOf - 같은 숫자는 객체를 생성하지 않고 참조할 수 있도록 한다. 3. 참조 계수 관리하는 2가지 방법 1. G..
Exception * Checked Exception: => 반드시 사용자가 예외 처리를 하던가, 외부로 던져야 한다. => IOException * Unchecked Exception: => 처리하지 않아도 되지만, 예외 발생시 프로그램이 종료된다. 스택을 만들어보자 import java.io.*; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } // Java 7: Try with Resource // C#: using 구문 public void save(String filename) { try (FileOutputStream fos..
U : Ctrl + zCtrl + r : REDO YY : Ctrl + c P : Ctrl + v DD : Ctrl + x v : 블록지정 (블록지정후) : 탭 단위 앞으로 뒤로 밀기 Shift :+ { } : 공간 기준 이동^ : home$ : endgg : 맨 위G : 맨 뒤 화면이동 : split / split 파일이름. Ctrl + ww/wW : 커서 이동 설정창 : vi ~/.vimrc Command + . : home, end 터미널Cd : 디렉토리에 들어감Mkdir : 디렉토리 만들기Rm : 파일삭제Rm -r : 폴더삭제Cat + 파일이름 : 파일내용 보여주기 Ctrl + c : 무한루프에서 빠져나가기 -g : 디버그
비메모리 자원에 대한 누수가 명시적인 종료 메소드를 호출하지 않을 경우, 발생할 수도 있고 아닐 수도 있다. => 자바 클래스 라이브러리는 비 메모리 자원에 대한 파괴를 finalize를 통해서 제공하고 있다. 1) 호출 시점이 명확하지 않다. : GC 의 발생시점이 언제인지 알 수 없다. 2) finalize의 호출이 보장되지 않는다. : 누수가 발생할 가능성이 있다. 스택을 만들어보자 class User implements AutoCloseable { private String name; private int age; // File: 비메모리 자원 // => User라는 객체를 사용할 때 반드시 명시적인 종료 메소드를 제공해야 한다. // => Try with Resources 문법을 사용할 수 있도..