람다식은 Java 8에서 도입된 기능으로, 익명 함수(anonymous function)를 간결하게 표현할 수 있게 해줍니다. 주로 함수를 인자로 넘길 때 유용하게 사용됩니다. 자바의 람다식은 함수형 인터페이스와 함께 사용됩니다. 함수형 인터페이스는 오직 하나의 추상 메서드만을 갖는 인터페이스입니다.
 

예제 1: 기본적인 람다식

import java.util.Arrays;
import java.util.List;

public class LambdaExample {
    public static void main(String[] args) {
        // 리스트를 생성합니다.
        List<String> names = Arrays.asList("A", "B", "C", "D");

        // 람다식을 사용하여 리스트의 각 요소를 출력합니다.
        names.forEach(name -> System.out.println(name));
    }
}

 

  • names.forEach(name -> System.out.println(name));는 forEach 메서드를 사용하여 리스트의 각 요소를 출력합니다. 여기서 name -> System.out.println(name)이 람다식입니다. name은 리스트의 각 요소를 나타내며, ->는 람다식을 정의하는 구분자입니다.

 

예제 2: 함수형 인터페이스와 람다식 

@FunctionalInterface
interface MathOperation {
    int operate(int a, int b);
}

public class LambdaExample {
    public static void main(String[] args) {
        // 덧셈 연산을 수행하는 람다식을 정의합니다.
        MathOperation add = (a, b) -> a + b;

        // 뺄셈 연산을 수행하는 람다식을 정의합니다.
        MathOperation subtract = (a, b) -> a - b;

        // 두 연산을 테스트합니다.
        System.out.println("덧셈: " + operate(5, 3, add));       // 출력: 덧셈: 8
        System.out.println("뺄셈: " + operate(5, 3, subtract));  // 출력: 뺄셈: 2
    }

    // MathOperation 인터페이스를 사용하여 연산을 수행하는 메서드입니다.
    public static int operate(int a, int b, MathOperation operation) {
        return operation.operate(a, b);
    }
}

 

  • @FunctionalInterface 애너테이션을 사용하여 MathOperation 인터페이스가 함수형 인터페이스임을 명시합니다.
  • MathOperation add = (a, b) -> a + b;는 두 정수를 더하는 람다식입니다.
  • MathOperation subtract = (a, b) -> a - b;는 두 정수를 빼는 람다식입니다.
  • operate 메서드는 MathOperation 인터페이스를 매개변수로 받아 해당 연산을 수행합니다.

1. 단일 책임 원칙 (Single Responsibility Principle, SRP)

설명:
단일 책임 원칙은 "하나의 클래스는 하나의 책임만 가져야 한다"는 원칙입니다. 여기서 '책임'은 클래스가 수행하는 기능을 의미합니다. 한 클래스가 여러 가지 기능을 가지고 있으면, 변경이 일어날 때 여러 이유로 인해 수정이 필요하게 됩니다. 이는 코드의 유지보수성을 떨어뜨리고 버그 발생 가능성을 높입니다.

 

타당성 : 

자바에서 클래스를 설계할 때 단일 책임 원칙을 준수하면 클래스의 복잡성을 줄이고, 유지보수성을 높일 수 있습니다. 클래스가 하나의 책임만 가지면 변경 이유가 명확해지기 때문에 코드 수정 시 다른 부분에 영향을 미칠 가능성이 줄어듭니다. 또한, SRP를 따르는 클래스는 더 작은 단위로 나누어져 있어 테스트하기 쉽습니다.

 

2. 개방-폐쇄 원칙 (Open-Closed Principle, OCP)

설명:
개방-폐쇄 원칙은 "클래스는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다"는 원칙입니다. 즉, 새로운 기능을 추가할 때 기존 코드를 변경하지 않고도 확장할 수 있어야 합니다. 이를 통해 코드의 안정성을 유지하면서 새로운 요구사항에 대응할 수 있습니다.

 

타당성 :  .

자바는 상속과 인터페이스를 지원하여 개방-폐쇄 원칙을 적용하기에 적합한 언어입니다. OCP를 준수하면 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있어 코드의 안정성을 유지할 수 있습니다. 예를 들어, 새로운 기능을 추가할 때 기존 클래스의 코드를 수정하는 대신 새로운 클래스를 추가하거나 상속을 통해 확장할 수 있습니다.

3. 리스코프 치환 원칙 (Liskov Substitution Principle, LSP)

설명:
리스코프 치환 원칙은 "서브 클래스는 언제나 자신의 기반 클래스 타입으로 교체할 수 있어야 한다"는 원칙입니다. 즉, 프로그램에서 부모 클래스의 인스턴스를 사용하는 모든 곳에서 자식 클래스의 인스턴스를 사용하더라도 프로그램의 정확성이 유지되어야 합니다. 이를 통해 객체 지향 프로그래밍의 다형성을 보장합니다.

 

타당성 : 

자바의 상속 구조에서 리스코프 치환 원칙을 준수하면 코드의 재사용성과 확장성이 크게 향상됩니다. LSP를 지키면 자식 클래스가 부모 클래스의 행동을 일관되게 유지하기 때문에 다형성을 제대로 활용할 수 있습니다. 이는 자바의 인터페이스와 추상 클래스에서 특히 중요하며, 올바르게 설계된 상속 구조는 시스템의 유연성을 높입니다.

4. 인터페이스 분리 원칙 (Interface Segregation Principle, ISP)

설명:

인터페이스 분리 원칙은 "특정 클라이언트를 위한 인터페이스 여러 개가 범12345용 인터페이스 하나보다 낫다"는 원칙입니다. 즉, 인터페이스는 클라이언트가 필요로 하는 메서드들만 제공해야 하며, 불필요한 메서드를 포함해서는 안 됩니다. 이를 통해 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않게 합니다.

 

타당성 :

자바의 인터페이스는 인터페이스 분리 원칙을 적용하기에 이상적입니다. 자바 개발에서 ISP를 준수하면 클라이언트가 필요로 하지 않는 메서드를 구현하지 않아도 되므로 불필요한 의존성을 줄일 수 있습니다. 이는 코드의 결합도를 낮추고, 변경에 대한 영향을 최소화하며, 코드의 가독성과 유지보수성을 높입니다.

5. 의존 역전 원칙 (Dependency Inversion Principle, DIP)

설명:
의존 역전 원칙은 "고수준 모듈은 저수준 모듈에 의존해서는 안 된다. 둘 다 추상화에 의존해야 한다"는 원칙입니다. 또한 "추상화는 구체적인 것에 의존해서는 안 되며, 구체적인 것이 추상화에 의존해야 한다"는 의미를 포함합니다. 이를 통해 코드의 유연성과 재사용성을 높입니다.

 

타당성 : 

자바에서 의존 역전 원칙을 준수하면 고수준 모듈과 저수준 모듈 간의 결합도를 줄일 수 있습니다. 이를 통해 코드의 유연성과 재사용성이 크게 향상됩니다. 자바의 인터페이스와 추상 클래스를 사용하여 고수준 모듈이 저수준 모듈의 구체적인 구현에 의존하지 않도록 설계할 수 있습니다. 이는 특히 대규모 애플리케이션에서 중요한 원칙입니다.

 

 

 

 

자바에서 파일을 읽는 다양한 방법 중 read()와 read(byte[] b, int offset, int len) 메소드의 차이점을 비교해보고, 더 효율적인 방법을 선택하는 것이 중요합니다.

read() 메소드와 read(byte[] b, int offset, int len) 메소드 비교

효율성:

  • read() 메소드는 한 번에 한 바이트씩 읽기 때문에, I/O 작업이 많이 발생하여 성능이 저하될 수 있습니다.
  • read(byte[] b, int offset, int len) 메소드는 한 번에 여러 바이트를 읽을 수 있어 I/O 작업의 횟수를 줄여 성능이 향상됩니다.

버퍼 사용:

  • read() 메소드는 읽은 데이터를 배열이나 스트링에 저장하려면 추가적인 작업이 필요합니다.
  • read(byte[] b, int offset, int len) 메소드는 바이트 배열에 데이터를 한꺼번에 저장할 수 있어 후속 처리가 훨씬 간편하고 효율적입니다.

 

public class LowerCaseInputStream extends FilterInputStream{
	protected LowerCaseInputStream(InputStream in) {
		super(in);
		
	}
	
	public int read() throws IOException{
		int c = in.read();
		return (c == -1? c : Character.toLowerCase((char)c));
	}
	
	public int read(byte[] b, int offset, int len) throws IOException{
		
		int result = in.read(b, offset, len);
		for(int i = offset; i < offset + result; i ++) {
			b[i] = (byte)Character.toLowerCase((char)b[i]);
		}
		return result;
	}

}


public class testMain{
	public static void main(String[] args) throws IOException{
		int c;
		try {
			String inFilePath = "test/test.txt";
			String outFilePath = "test/write2.txt";
			InputStream in = new LowerCaseInputStream(new BufferedInputStream(new FileInputStream(inFilePath)));
			 OutputStream out = new FileOutputStream(outFilePath);
		
	    /*	
			while((c = in.read()) >= 0) {
				System.out.print((char)c);
				
			}
		*/
			  byte[] buffer = new byte[1024];
			 while ((c = in.read(buffer, 0, buffer.length)) != -1) {
	                System.out.write(buffer, 0, c);
	                
	                out.write(buffer, 0, c);
	            }
			 
			 in.close();
			 out.close();
		}catch (IOException e) {
			e.printStackTrace();
		}
		
	}
    
}

 

 

결론

  • 효율성: 한 번에 여러 바이트를 읽음으로써 I/O 작업을 줄입니다.
  • 가독성: 코드가 더 간결하고 명확합니다.
  • 유지보수성: 데이터 처리 로직이 간단해져 유지보수하기 쉽습니다.

따라서 read()메소드 보다는 read(byte[] b, int offset, int len) 메소드를 사용하는 것이 더 바람직합니다.

 

참고 

  1. 자바 표준 라이브러리 문서:
    • InputStream 클래스의 read() 
    • InputStream 클래스의 read(byte[] b, int off, int len)

'Java' 카테고리의 다른 글

Java 람다  (0) 2024.08.10
JAVA SOLID 개념  (0) 2024.07.17
String vs StringBuilder 속도 비교  (0) 2024.03.23
Java에서 Json(Object, Array) 다루기  (0) 2024.03.01
Java 개행처리  (0) 2024.02.28

뮤터블 객체는 생성 후 그 상태를 변경 할 수 있는 반면 이뮤터블 객체는 생성 후 그 상태를 변경 할 수 없는 객체를 말한다. 

자바에서는 String 객체는 값을 변경 할 수 없는 이뮤터블 객체이다. 

String string = "Hello"; //1번
System.out.println(System.identityHashCode(str1)); // 140799417 해쉬코드 식별 값을 반환
string  += "World"; //2번 
System.out.println(System.identityHashCode(str1)); // 926370398

 

위에서 실행 한 2번째 코드는 다음과 같은  실행 과정을 거친다. 

1. 새로운 String 객체 string 객체를 생성한다.

2. string 에 "Hello" 값을 하나씩 복사한다.

3. "Hello" 뒤에 "World" 값을 저장한다. 

 

이렇게 하나하나 짚어가며 찾는 방식은 시간 복잡도가 O(N)이 된다.   

 

StringBuilder클래스는 뮤터블 하므로 문자열 변경 할 때 시간 복잡도 관점에서 훨씬 효율적이다.

 

 

● 테스트 코드

public static void main(String[] args) {

	String string = "Hello";

    System.out.println(System.identityHashCode(string)); // 메소드는 객체를 특정 할 수 있는 식별 값을 반환
    string += "World";
    System.out.println(System.identityHashCode(string));

    System.out.println("------------------시간복잡도 String -------------------");
    long start = System.currentTimeMillis();
    for(int i =1; i <= 100000; i++) {
    string +=i;
}
    long end = System.currentTimeMillis();
    System.out.println(((end - start) / 1000.0) +"초");

    System.out.println("------------------시간복잡도 StringBuilder---------------------");

    long start2 = System.currentTimeMillis();
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append("Hello");
    stringBuilder.append("World");
    for(int i =1; i <= 100000; i ++) {
    stringBuilder.append(i);
}
    long end2 = System.currentTimeMillis();

    System.out.println(((end2 - start2) / 1000.0) +"초");


    long result1 =  end - start;
    long result2 =  end2 - start2;

    System.out.println("------------------StringBuilder의 속도 String에 비해 ---------------------");

    long res = (result1 / result2);
    System.out.println("StringBuider성능 : "+res+"배");
}

 

● 비교수행 결과

String vs StringBuilder 속도비교

 

● 참고서적 : 코딩테스트 합격자되기(자바편)

'Java' 카테고리의 다른 글

JAVA SOLID 개념  (0) 2024.07.17
JAVA 파일 읽기 및 효율적인 I/O 처리 방법  (0) 2024.06.15
Java에서 Json(Object, Array) 다루기  (0) 2024.03.01
Java 개행처리  (0) 2024.02.28
Java JDBC Connection  (0) 2024.02.24

Java에서 key, value 값을 Json Object담고 다시 jsonArray로 담아서 출력한다.

해당 부분은 그리드 화면에서 key, value 값을 비교 할 때 유용하다. 

Java에서 Json(Object, Array) 다루기
import java.util.HashMap;
import java.util.Map;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class Test {
public static void main(String[] args) {

Map<String, Object> result = new HashMap<String, Object>();
Map<String, String> item = new HashMap<String, String>();
item.put("1", "사과");
item.put("2", "딸기");
item.put("3", "배");
item.put("4", "토마토");
item.put("5", "망고");
JSONObject obj = new JSONObject();
JSONArray jsonArray = new JSONArray();
     for(Map.Entry entry : item.entrySet()){
          String key = (String) entry.getKey();
          String value = (String) entry.getValue();

          System.out.println(key+"|"+ value);
          obj.put(key, value);
     }

     jsonArray.add(obj);
     result.put("resultLIst : ", jsonArray);

    System.out.println(result);
   }
}
 

 

'Java' 카테고리의 다른 글

JAVA SOLID 개념  (0) 2024.07.17
JAVA 파일 읽기 및 효율적인 I/O 처리 방법  (0) 2024.06.15
String vs StringBuilder 속도 비교  (0) 2024.03.23
Java 개행처리  (0) 2024.02.28
Java JDBC Connection  (0) 2024.02.24

: "/" 리눅스, 유닉스 , "\\" 윈도우

테스트 결과
public class LineSeparator {


public static final String LINE_SEPARATOR1 
                                    System.getProperty("line.separator"); //java 6이하 버전

public static final String LINE_SEPARATOR2 = 
                                    System.lineSeparator();//java 7이상버전

public static void main(String[] args) {
System.out.println("1개행테스트"+LINE_SEPARATOR2+"2개행테스트");
System.out.println("1개행테스트 \n2개행테스트");

    }
}

 

개행test결과

'Java' 카테고리의 다른 글

JAVA SOLID 개념  (0) 2024.07.17
JAVA 파일 읽기 및 효율적인 I/O 처리 방법  (0) 2024.06.15
String vs StringBuilder 속도 비교  (0) 2024.03.23
Java에서 Json(Object, Array) 다루기  (0) 2024.03.01
Java JDBC Connection  (0) 2024.02.24

JDBC(Java Database Connectivity)
데이터베이스를 Java에서 사용 할 수 있도록 제공하는 API다.

 

각 DBMS에 접속 하기 위해서는 Class.forName("jdbc_driver"); 맞는 jdbc_driver를 추가한다. 

물론 각 jdbc jar파일은 build된 상태여야 한다.  

각 DBMS jdbc_driver 
----------------------------------------------------------------------------
Oracle  : oracle.jdbc.driver.OracleDriver  
Mssql  : sun.jdbc.odbc.JdbcOdbcDriver
Mysql  : com.mysql.jdbc.Driver
postgresql : org.postgresql.Driver
TIBERO : com.tmax.tibero.jdbc.TbDriver 
DB2 : com.ibm.db2.jcc.DB2Driver 
Mongo : mongodb.jdbc.MongoDriver
Maria : org.mariadb.jdbc.Driver  
Cubrid : cubrid.jdbc.driver.CUBRIDDriver
Sqlite : org.sqlite.JDBC

 

JDBC(oracle) Test DBUtil.java 

jdbc connection(oracle)

'Java' 카테고리의 다른 글

JAVA SOLID 개념  (0) 2024.07.17
JAVA 파일 읽기 및 효율적인 I/O 처리 방법  (0) 2024.06.15
String vs StringBuilder 속도 비교  (0) 2024.03.23
Java에서 Json(Object, Array) 다루기  (0) 2024.03.01
Java 개행처리  (0) 2024.02.28

+ Recent posts