728x90
반응형
SMALL

Java의 Exception이 처리되는 순서를 설명해주세요. catch 안에 exception 이 또 발생하는 경우 어떻게 되나요?

  1. try 블록: 예외가 발생할 수 있는 코드를 포함하는 부분이다. 이 블록 내에서 예외가 발생하면, JVM(Java Virtual Machine)은 해당 예외 객체를 생성하고, 적절한 catch 블록을 찾기 위해 이를 던진다(throws).
  2. catch 블록: 특정 종류의 예외를 처리하는 코드를 포함하는 부분이다. catch 블록은 특정 예외 클래스 또는 그 하위 클래스를 처리한다. try 블록에서 발생한 예외가 catch 블록에서 선언된 예외와 일치하거나 그 하위 클래스이면, 해당 catch 블록의 코드가 실행된다. 여러 개의 catch 블록이 있을 수 있으며, 이들은 위에서 아래로 적용되어 첫 번째로 일치하는 catch 블록이 실행된다.
  3. finally 블록: 예외가 발생하든 발생하지 않든 반드시 실행되는 코드를 포함하는 부분이다. 이는 주로 자원 해제와 같은 클린업 작업에 사용된다.

Java 7부터는 멀티-캐치 블록이 도입되어 하나의 catch 블록에서 여러 예외를 처리할 수 있게 되었다. 이를 통해 코드의 중복을 줄이고 가독성을 향상시킬 수 있다.

예외 처리 과정은 다음과 같은 순서로 진행된다:

  1. try 블록 내의 코드가 실행된다.
  2. try 블록 내에서 예외가 발생하면, 해당 예외 객체가 생성되고 시스템에 의해 던져진다.
  3. 던져진 예외와 일치하는 catch 블록이 찾아진다. 일치하는 catch 블록이 없으면, 예외는 메소드 외부로 전파된다.
  4. 일치하는 catch 블록의 코드가 실행되어 예외를 처리한다.
  5. finally 블록의 코드가 실행된다. 이 코드는 예외 발생 유무와 상관없이 항상 실행된다.

이러한 방식을 통해 Java는 예외 상황을 효과적으로 관리하고, 프로그램의 안정성과 신뢰성을 보장한다.

catch 블록 내에서 예외가 발생하면, 그 예외는 일반적으로 새로운 예외로 취급되고 해당 catch 블록을 벗어나 전파된다. 이는 try 블록 내에서 발생한 원래의 예외와는 별개이다. catch 블록 내에서 발생한 이 새로운 예외를 처리하려면, 해당 catch 블록 내에 추가적인 try-catch 문을 사용하여 처리할 수 있다.

try {
    // some code that might throw an exception
} catch (Exception e) {
    try {
        // handling code that might throw another exception
    } catch (Exception innerException) {
        // handle exception thrown within the catch block
    }
} finally {
    // cleanup code
}

위 코드에서 볼 수 있듯이, catch 블록 내의 예외는 별도의 try-catch 문으로 처리된다.

catch 블록 내에서 발생하는 예외는 주의해야 한다. 이런 상황이 발생하면, 원래의 예외는 새로운 예외에 의해 가려질 수 있다. 이로 인해 디버깅이 어려워질 수 있으므로, 가능한한 catch 블록 내에서는 예외가 발생하지 않도록 코드를 작성하는 것이 바람직하다.

728x90
반응형
LIST
728x90
반응형
SMALL

RDB와 NoSQL은 무엇인가요? 차이점 또는 장단점 위주로 설명해주세요.

RDS

"관계형 데이터베이스(Relational Database)"의 약자 관계형 데이터베이스는 데이터를 테이블 형태로 저장하는 데이터베이스이다. 각 테이블은 행과 열로 구성되며, 테이블 간에는 관계가 있을 수 있다.

예를 들어, "사용자" 테이블과 "주문" 테이블이 있을 때, 각 주문은 특정 사용자에게 속하므로 이 두 테이블은 관계를 가질 수 있다. 이렇게 데이터 간의 관계를 효율적으로 표현하고 관리할 수 있는 것이 관계형 데이터베이스의 핵심적인 특징이다.

RDB는 데이터의 무결성을 보장하는 데 특화되어 있다. 즉, 데이터는 일관되고 정확하며, 중복되지 않는다. SQL(Structured Query Language)은 RDB에서 데이터를 조회하고 조작하기 위해 널리 사용되는 언어이다.

RDB는 다양한 유형의 애플리케이션에서 사용될 수 있으며, 대표적인 RDBMS(Relational Database Management System)로는 MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server 등이 있다.

그러나 RDB는 모든 시나리오에 적합한 것은 아니다. 예를 들어, 큰 규모의 데이터를 빠르게 처리하거나 분산 시스템에서 운영해야 하는 경우에는 NoSQL 데이터베이스 같은 다른 유형의 데이터베이스가 더 적합할 수 있다.


NoSQL

NoSQL(Not Only SQL)은 관계형 데이터베이스(RDB)의 한계를 극복하기 위해 설계된 비관계형 데이터베이스 시스템 NoSQL 데이터베이스는 큰 규모의 데이터를 빠르게 처리하고 분산 처리를 지원하는데 특화되어 있다.

NoSQL 데이터베이스는 여러 가지 형태가 있다. 대표적인 형태는 다음과 같다:

  1. 키-값 저장소(Key-Value Stores): 이 유형의 데이터베이스는 각 값(value)에 고유한 키(key)를 사용하여 데이터를 저장하고 검색한다. 예를 들어, Redis와 DynamoDB가 여기에 해당
  2. 문서 데이터베이스(Document Databases): 이 유형의 데이터베이스는 JSON, BSON, XML 등의 형태로 저장된 문서를 사용하여 데이터를 저장하고 검색한다. MongoDB가 대표적인 예
  3. 컬럼 지향 데이터베이스(Column-Oriented Databases): 이 유형의 데이터베이스는 데이터를 열 단위로 저장하여 빠른 읽기와 쓰기를 가능하게 한다. Apache Cassandra가 대표적인 예
  4. 그래프 데이터베이스(Graph Databases): 이 유형의 데이터베이스는 데이터 간의 관계를 그래프로 표현하고, 이를 통해 복잡한 관계를 쉽게 탐색할 수 있다. Neo4j가 대표적인 예

NoSQL 데이터베이스의 주요 장점 중 하나는 유연성이다. 스키마를 미리 정의할 필요가 없으므로, 데이터의 형식이 시간이 지나면서 변화해도 쉽게 대응할 수 있다. 또한, NoSQL 데이터베이스는 일반적으로 수평적으로 확장이 가능하므로, 데이터의 크기가 늘어나도 성능을 유지할 수 있다. 이러한 특징 때문에, NoSQL은 대규모의 실시간 데이터 처리, 분산 처리 등의 요구사항이 있는 애플리케이션에서 주로 사용된다.


RDB와 NoSQL의 차이점

1. 데이터 모델:

  • RDB: 관계형 데이터베이스는 데이터를 테이블로 구성하며, 각 테이블은 행(row)과 열(column)로 구성된다. 테이블 간에는 관계가 있을 수 있어 데이터 중복을 최소화하고 데이터 무결성을 유지하는 데 유용하다.
  • NoSQL: NoSQL 데이터베이스는 여러 가지 데이터 모델을 사용하며, 대표적으로는 키-값 쌍, 문서, 컬럼, 그래프 형태 등이 있다. 데이터의 유연한 표현이 가능하며, 고정된 스키마 없이 다양한 형태의 데이터를 저장할 수 있다.

2. 확장성:

  • RDB: 관계형 데이터베이스는 일반적으로 수직 확장을 지원한다. 즉, 하나의 서버의 성능을 향상시켜 처리 능력을 증가시킨다. 그러나 수평 확장은 복잡하고 비용이 많이 든다.
  • NoSQL: NoSQL 데이터베이스는 수평 확장을 용이하게 지원한다. 여러 서버에 데이터를 분산시켜 처리 능력을 높일 수 있다. 이러한 특징은 빅데이터와 같이 대용량 데이터 처리에 유리히다.

3. 트랜잭션 처리:

  • RDB: 관계형 데이터베이스는 ACID(원자성, 일관성, 고립성, 지속성) 트랜잭션을 지원한다. 이는 엄격한 데이터 일관성을 유지하도록 도와준다.
  • NoSQL: 대부분의 NoSQL 데이터베이스는 ACID 트랜잭션을 지원하지 않는다. 일부는 일관성을 희생하여 처리 성능을 향상시키는 경우가 많다. (일부 최신 NoSQL 시스템은 ACID 트랜잭션을 지원하기 시작했다)

4. 질의 언어(계속):

  • NoSQL: NoSQL 데이터베이스는 SQL을 사용하지 않거나, 일부 변형된 형태의 SQL을 사용한다. 각 NoSQL 데이터베이스마다 사용하는 질의 언어가 다르며, SQL만큼 표준화되지 않았다. 이로 인해, 데이터를 조회하거나 조작하는 방법이 NoSQL 시스템마다 다르게 될 수 있다.

5. 데이터 무결성 및 일관성:

  • RDB: 관계형 데이터베이스는 데이터 무결성 규칙과 ACID 트랜잭션 속성을 통해 데이터의 일관성을 보장한다. 이는 특히 데이터의 정확성이 중요한 금융, 보건 의료 등의 분야에서 중요하다.
  • NoSQL: NoSQL 데이터베이스는 일반적으로 이벤추얼 일관성(eventual consistency) 모델을 따른다. 이는 모든 데이터의 복제본이 즉시 일치하지 않을 수 있음을 의미한다. 그러나 시간이 지나면 모든 복제본이 일관성을 가지게 된다. 이러한 접근법은 성능과 확장성을 향상시키지만, 데이터 일관성을 완전히 보장하지는 못한다.

이러한 차이점들은 각 데이터베이스가 적합한 사용 사례를 결정한다. 관계형 데이터베이스는 정확한 데이터와 복잡한 질의를 필요로 하는 애플리케이션에 적합하며, NoSQL 데이터베이스는 유연한 데이터 모델과 대량의 데이터를 빠르게 처리하는 애플리케이션에 적합하다. 결국 애플리케이션의 요구 사항에 따라 선택해야 한다.


RDB와 NoSQL의 장단점

관계형 데이터베이스(RDB)의 장단점

장점:

  1. 데이터 무결성: 데이터는 테이블의 구조와 제약 조건에 의해 엄격하게 제어되므로, 데이터의 무결성과 일관성이 보장된다.
  2. 표준화: SQL(Structured Query Language)은 관계형 데이터베이스에서 사용되는 표준화된 언어로, 성숙하고 강력한 질의 기능을 제공한다.
  3. ACID 트랜잭션: 관계형 데이터베이스는 ACID(Atomicity, Consistency, Isolation, Durability) 트랜잭션을 지원하여 데이터의 일관성을 유지한다.

단점:

  1. 확장성: 관계형 데이터베이스는 대체로 수직 확장(vertical scaling)을 통해 성능을 높이는데, 이는 비용이 많이 들고 한계가 있다. 또한 수평 확장(horizontal scaling)이 어렵다.
  2. 유연성 부족: 고정된 스키마에 의해 데이터 구조가 제한되므로, 데이터 구조가 자주 변경되는 경우 유연하게 대응하기 어렵다.

NoSQL 데이터베이스의 장단점

장점:

  1. 확장성: NoSQL 데이터베이스는 수평 확장이 쉽다. 이는 데이터를 여러 서버에 분산시켜 대량의 데이터를 처리하는 데 유리하다.
  2. 유연성: 고정된 스키마가 없기 때문에, 다양한 형태와 구조의 데이터를 저장할 수 있으며, 데이터 구조의 변경에 유연하게 대응할 수 있다.

단점:

  1. 일관성: 일부 NoSQL 데이터베이스는 이벤추얼 일관성(eventual consistency)을 지원하는데, 이는 데이터가 즉시 갱신되지 않을 수 있음을 의미한다. 즉, 모든 클라이언트가 동시에 동일한 데이터를 보지 못할 수 있다.
  2. 표준화 부재: NoSQL 데이터베이스마다 사용하는 질의 언어와 인터페이스가 다르다. 이로 인해 학습 곡선이 있을 수 있고, 포팅이 어려울 수 있다.
728x90
반응형
LIST
728x90
반응형
SMALL

오버로딩(Overloading)

  • 메서드의 이름은 같고 매개변수의 갯수나 타입이 다른 함수를 정의하는 것을 의미한다.
  • 리턴값만을 다르게 갖는 오버로딩은 작성 할 수 없다.

프로그래밍에서 주로 사용되는 용어로, 주로 메서드 또는 함수의 이름은 동일하지만 매개변수의 유형이나 개수가 다른 여러 메서드 또는 함수를 하나의 클래스나 객체 안에 정의하는 기법을 의미

public int add(int a, int b) {
    return a + b;
}

public float add(float a, float b) {
    return a + b;
}

'add'라는 이름의 함수를 정의할 때, 이 함수가 두 개의 정수를 더하는 기능과 두 개의 실수를 더하는 기능을 동시에 가질 수 있도록 만들 수 있다. 이 경우, 함수 이름은 'add'로 동일하지만, 매개변수의 유형이나 개수가 다르므로 이를 오버로딩이라고 한다.

오버로딩을 사용하면 같은 이름의 메서드나 함수를 동일하게 사용할 수 있으므로 코드의 가독성을 높일 수 있다. 또한, 메서드나 함수의 이름을 새로 생각해내는 데 시간을 쓰지 않아도 되므로 개발 시간을 절약할 수 있다.

단, 오버로딩된 함수나 메서드는 매개변수의 유형이나 개수가 달라야 하며, 반환 유형만 다른 경우에는 오버로딩으로 간주되지 않는다. 이는 컴파일러나 인터프리터가 호출할 함수나 메서드를 결정하는 방식 때문이다. 함수나 메서드를 호출할 때 매개변수의 유형과 개수를 기반으로 어떤 함수나 메서드를 실행할지 결정하게 되는데, 반환 유형만 다른 경우에는 이를 구분할 수 없기 때문이다.


오버라이딩(Overriding)

  • over + ride = 먼가 위에서 (라이딩 한다)달린다???
  • 상위 클래스의 메서드를 하위 클래스가 재정의 하는 것이다.
  • 메서드의 이름은 물론 파라메터의 갯수나 타입도 동일해야 하며, 주로 상위 클래스의 동작을 상속받은 하위 클래스에서 변경하기 위해 사용된다.

객체지향 프로그래밍에서 사용되는 개념으로, 하위 클래스 또는 파생 클래스에서 상위 클래스 또는 부모 클래스의 메서드를 재정의하는 것을 의미

오버라이딩은 상속 관계에서 발생한다. 즉, 하위 클래스는 상위 클래스에서 정의한 메서드를 그대로 상속받을 수도 있고, 필요에 따라 동일한 이름의 메서드를 재정의하여 사용할 수 있다. 이때, 원래 메서드의 선언(매개변수의 유형 및 개수)은 변경되지 않지만, 메서드의 내부 구현이 변경된다.

오버라이딩을 통해 코드 재사용성을 높일 수 있으며, 다형성(polymorphism)을 지원하는 객체지향 언어의 주요 기능 중 하나이다. 다형성은 상위 클래스의 참조를 사용하여 하위 클래스의 인스턴스를 조작할 수 있는 기능을 의미하며, 오버라이딩된 메서드를 호출할 때 실행되는 코드는 객체의 실제 타입에 따라 결정된다.

class Animal {
    void makeSound() {
        System.out.println("The animal makes a sound");
    }
}

class Dog extends Animal {
    void makeSound() {
        System.out.println("The dog barks");
    }
}

class Cat extends Animal {
    void makeSound() {
        System.out.println("The cat meows");
    }
}

Java에서 'Animal'이라는 상위 클래스가 'makeSound'라는 메서드를 가지고 있고, 'Dog'과 'Cat'이라는 하위 클래스가 각각 'makeSound' 메서드를 오버라이딩하여 다르게 구현하면, 'Animal' 클래스의 참조를 사용하여 'Dog' 또는 'Cat' 인스턴스의 'makeSound' 메서드를 호출할 수 있다. 이때 호출된 'makeSound' 메서드는 객체의 실제 타입에 따라 'Dog' 또는 'Cat' 클래스에서 오버라이딩된 'makeSound' 메서드가 된다.

오버라이딩은 다양한 타입의 객체를 일관된 방식으로 처리할 수 있게 해주며, 코드의 유연성과 확장성을 높여준다.


오버로딩과 오버라이딩의 차이점

오버로딩(Overloading)은 기존에 없던 새로운 메서드를 정의하는 것이고,

오버라이딩(Overriding)은 상속 받은 메서드의 내용만 변경 하는 것이다.

구분 오버로딩 오버라이딩

메소드 이름 동일 동일
매개변수, 타입 다름 동일
리턴 타입 상관없음 동일

가장 큰 차이는 오버로딩이 같은 이름을 가진 함수나 메서드가 다양한 매개변수를 가질 수 있게 하는 반면, 오버라이딩은 상속받은 메서드의 동작을 하위 클래스에서 변경할 수 있게 한다는 것이다. 이 두 개념은 모두 객체지향 프로그래밍의 다형성 개념을 지원한다.

728x90
반응형
LIST

+ Recent posts