728x90
반응형
  1. 자바의 데이터 타입인 기본형에 대해서 말하시오.
    정수형 - byte, short, int, long
    실수형 - double, float
    bool형 - boolean

    각 데이터 형간에는 형변환이 가능하며, 큰 값에서 작은 값으로 캐스팅 시에는 값 손실이 있으므로, 반드시 (데이터형)을 표기하고 형변환 하여야 함

  2. 자바의 데이터 타입인 reference Type에 대해서 설명하시오.
    기본형을 제외한 나머지 모두가 reference Type.
    데이터 타입과는 달리, 참조값을 통해 해당 객체에 직접적으로 접근할 수 있음.

  3. 접근 제어자의 종류와 특성에 대해 설명하시오.
    Public (어디서든 접근이 가능) 
    Default (같은 패키지 내 혹은 상속 받은 클래스 내에서 접근 가능)
    Protected (같은 패키지 내에서만 접근 가능)
    Private (같은 클래스 내에서만 접근 가능)

  4. 프로세스와 스레드란?
    • 프로세스 -  실행되고 있는 프로그램의 개체. CPU 시간이나 메모리 등 시스템 장원이 할당되는 독립적인 개체. 다른 프로세스와 상관 없이 독립적으로 자원을 할당 받음.프로세스 간의 통신을 위해선 파이프, 파일, 소켓 등을 사용하여 통신하여야 함
    • 쓰레드 - 프로세스 안에 존재하여, 프로세스의 자원을 공유하는 개체
      흔히 경량 프로세스라고 부름 
      각 쓰레드는 별도의 레지스터와 스택을 갖고, 힙 영역은 공유함

  5. 뮤텍스와 세마포어
    • 프로세스 혹은 쓰레드 간의 통신 시에 shared memory 등을 쓰는 경우 하나의 자원에 두 개 이상의 프로세스 혹은 쓰레드가 접근하는 경우에 문제가 발생.
      이를 제어하기 위해 쓰레드에서는 뮤텍스를 사용하며, 프로세스에서는 세마포어를 사용 함
    • 뮤텍스
      • 상호배제라고도 하며, Critical Section을 가진 스레드의 Running time이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술 
        synchronized 또는 lock을 통해 해결
    • 세마포어
      • 리소스 상태를 나타내는 간단한 카운터
        공유 리소스에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근하여 사용할 수 있음. 

  6. 쓰레드를 구현하기 위한 방법?
    • Runnable 인터페이스 구현 
      • run 함수를 반드시 구현해야 함.
      • Thread 생성자의 매개변수로 입력
    • Thread 클래스를 상속
      • Thread 클래스를 상속 받아서 구현.
      • 자바는 다중 상속이 안되므로 이외의 클래스를 상속 받을 수 없음

  7. synchronized에 대해 설명 하시오.
    • 쓰레드가 하나의 자원을 공유함에 따라 데이터 일관성의 문제가 생기는데, synchronized 처리를 해줌으로써, 하나의 쓰레드만 접근할 수 있도록 함

  8. Static 키워드
    • 인스턴스 변수 혹은 인스턴스 메소드를 클래스 변수 혹은 클래스 메소드로 변경시킴
      모든 인스턴스 간에 공유하는 변수 혹은 메소드가 됨

  9. 클래스와 인스턴스의 차이
    • 클래스는 빵을 찍어 내는 틀과 같고, 인스턴스는 빵
      클래스에서 정해진 기능과 모양에 맞추어 인스턴스가 생성됨

  10. 객체지향과 절차지향의 차이점
    • 절차지향 - 순차적인 처리가 중요시 됩니다. 프로그램 전체가 유기적으로 연결되어 있어 하나의 코드 변경이 전체에 영향을 미칠 수 있음. 코드 사이즈를 최소화하고, 가장 빠르게 동작하는게 우선이면 절차지향 프로그래밍 언어를 사용
    • 객체 지향
      개발하려는 기능을 묶어 모듈화, 모듈을 재활용하기 때문에 같은 기능을 반복적으로 연산하지 않고 재사용률이 높음. 업그레이드가 쉬위며, 디버깅이 쉬움
      절차 지향에 비해 상대적으로 느림

  11. 자바와 C의 차이점
    • 자바는 One Source, Multi use 소스 하나를 가지고, 자바를 설치할 수 있는 플랫폼이라면 어떤 플랫폼에서도 소스 변경없이 사용 가능
      메모리 관리를 JVM 내 GC를 통해 이루어지므로 시스템 안정성이 높음
      자동으로 해주는 만큼 성능이 떨어지는 단점이 있음

  12. JAVA에서의 OOP
    • 캡슐화 - 객체 외부에서 개채 내부 정보를 직접 접근하거나 조작할 수 없고, 외부에서 접근할 수 있도록 정의된 메소드를 통해서만 관련 데이터에 접근할 수 있음
      내부 정보가 은폐되어 변경이 발생할 때 오류 발생이 적으며, 재사용이 용이함
    • 상속 - 이미 작성된 클래스를 이어 받아, 새로운 클래스를 생성하는 기법
      코드의 재활용성이 커짐
    • 다형성 - 하나의 객체가 여러 개의 자료형 타입을 가질 수 있는 특성
      ex) Tiger tiger = new Tiger();
            Animal animal = new Tiger();
           Predator predator = new Tiger();
      Tiger 클래스, Animal 클래스에 선언된 함수에만 접근이 가능함
      다형성이 없다면 각 클래스 객체 별로 연산을 해주어야 하나, 다형성으로 인해 하나로 묶을 수 있으므로 편리해짐

  13. 추상클래스와 인터페이스에 대해 설명하시오.
    • 인터페이스 - 클래스가 아닌, 다른 구조체 사용(interface).
      다중 상속이 가능하며, 구현을 명시한 클래스에서는 반드시 구현해야 함
      껍데기만 표현되어 있음
    • 한 개 이상의 추상 메소드를 가진 클래스. 다중 상속이 불가능 
      클래스 앞에 abstract가 붙으며, 실제 메소드 추가도 가능
      상속 받은 클래스에서 구현을 강제하지 않음

  14. 인스턴스 변수, 전역 변수, 로컬 변수
    • 전역/클래스 변수
      • 모든 인스턴스가 공통된 영역을 공유함
      • 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 경우에 클래스 변수로 선언
    • 인스턴스 변수
      • 클래스 영역에 선언되며, 클래스의 인스턴스를 생성할 때 만들어짐
      • 인스턴스는 독립적인 저장공간을 가지므로 인스턴스 별로 서로 다른 값을 가질 수 있음
    • 지역 변수
      • 메서드 내에 선언되며, 메서드 내에서만 사용가능
      • 메서드가 종료되면 소멸되는 변수
    • 변수 초기화 순서
      • 클래스 변수 -> 인스턴스 변수 -> 지역 변수
    • 변수 저장 영역
      • Method Area - 클래스에 대한 데이터와 클래스 변수 저장
      • Heap - 인스턴스가 생성되는 공간, 인스턴스의 정보들을 저장
      • 호출 스택 - 메서드의 작업에 필요한 메모리 공간을 제공, 메소드가 종료되면 할당되었던 메모리 공간이 반환됨

  15. 오버로딩과 오버라이딩의 차이
    • 오버로딩 - 똑같은 함수에 매개변수를 변경하여 선언하는 법
    • 오버라이딩 - 부모 클래스로 부터 상속 받은 메소드의 내부 구현 로직을 변경하는 방법

  16. 자바 제너릭이란?
    • 프로그래머가 의도하지 않은 객체가 저장될 수 없더록 타입을 지정하는 것

  17. 인터프리터와 컴파일러



  18. 리팩토링이란?
    • 중복된 메서드를 하나로 합치고, 이동하는 것을 말함

  19. instanceOf 명령어
    • 특정 객체가 특정 클래스의 객체 인지 확인할 때 사용하는 내부 명령어


OS(운영체제)
  1. 교착상태(데드락)
    데드락은 두 개 이상의 프로세스나 쓰레드가 서로 자원을 기다리면서 무한히 기다리게 되는 상태를 말합니다. 
    • 데드락을 피하는 방법
      • 상호 배제: 하나의 자원을 특정 시기에 하나의 프로세스/쓰레드만 소유할 수 있는 형태 
      • 자원 점유: 하나의 자원을 소유하고 다른 프로세스 혹은 쓰레드의 자원을 요청하는 상태
      • 선취 불가능: 하나의 프로세스/쓰레드에게 주어진 자원은 해당 프로세스/쓰레드가 스스로 놓기 전에는 놓게 만들 수 없는 상태
      • 순환 대기: 두 개의 프로세스/쓰레드의 경우, A->B, B->C, C->A에게 서로 자원을 요청하고 기다리는 상황으로 서로 꼬리를 물고 기다리는 상황
      • 4가지 중 하나라도 불충족하면 데드락이 발생하지 않음. 
        연간된 자원을 순차적으로 realese하는 방안과 전체를 제거하는 방안이 있음

  2. 멀티 프로세싱과 멀티 프로그래밍
    1. 멀티 프로세싱
      1. 여러 개의 CPU가 여러 개의 프로세스를 동시에 처리하는 방법
    2. 멀티 프로그래밍
      1. 한개의 CPU가 여러 개의 프로세스를 동시에 처리하는 방법



출처: http://manducku.tistory.com/44 [Manducku`s Code]

728x90
반응형
728x90
반응형

java

– 자바란 무엇인가요

자바란 객체지향 프로그래밍 언어로써 가장 중요한 특징은 운영체제에 독립적이란 것입니다. 자바로 작성된 프로그램은 운영체제의 종류에 관계없이 실행이 가능합니다. 그 이유는 자바를 실행하기 위한 가상 머신인 JVM이 있기 때문입니다. 다른 애플리케이션은 프로그램 실행 시 바로 OS로 가는 반면 자바 애플리케이션은 각 운영체제에 맞는 JVM을 거쳐 OS로 진행되기 때문에 프로그램 수정 없이 실행 가능합니다.

– 스프링이 뭔가요

자바언어를 기반으로 다양한 애플리케이션을 개발하기 위한 경량급 프레임워크입니다. 경량급이란 말은 스프링자체가 아주 가볍거나 작은 규모의 코드로 이뤄졌다는 것이 아니라 불필요하게 무겁지 않다라는 의미입니다. 그리고 개발 중에 테스트가 쉽다는 특징이 있습니다.

– 프레임워크란 무엇인가요

소프트웨어 제작을 편리하게 할 수 있도록 미리 뼈대를 이루는 클래스와 인터페이스를 제작하여 이것을 모아둔 것입니다. 프레임워크를 사용하게 되면 개발 생산성이 증가하며 품질이 향상되고 유지보수가 편리하다는 장점이 있습니다. 반면 익숙해지는데 시간이 오래 걸리며 유연성이 부족하게 됩니다.

– JDK란 무엇인가요

자바 프로그램 개발도구로써 개발을 위한 클래스, 컴파일러, 실행 및 배포도구를 포함하여 개발을 위한 전반적인 환경을 제공하는 것입니다.

– OOP란? 객체 지향 언어란?

객체 지향 프로그래밍를 의미합니다. 가장 중요한 특징은 캡슐화, 상속, 다형성입니다. 객체 지향 프로그래밍을 하게 되면 클래스라는 개념을 도입함으로써 코드의 재사용을 할 수 있습니다.

– MVC패턴이란 무엇인가요

애플리케이션은 크게 model, view, controller 세 영역으로 구분하여 영역 간의 결합도를 최소화한 논리적인 패턴입니다. 가장 큰 특징이며 장점은 비즈니스로직과 프리젠테이션로직이 분리 된다는 것입니다. 그로 인해 디자이너와 개발자의 영역이 분리 됨 으로써 작업의 분업화를 할 수 있습니다. 또한 유지보수에도 용이합니다.

– DAO란 무엇입니까

데이터 접근을 목적으로 하는 객체입니다.

– 오버라이딩이란 무엇인가요

부모 클래스에게 상속 받은 것들을 다시 자신의 클래스에서 새로이 재정의 하는 것을 말합니다. 재정의 한 것은 자신의 클래스 내부에서만 영향을 끼치며 부모클래스에서는 영향을 끼치지 않습니다. 할머니클래스, 부모클래스, 자식클래스의 구조라면 자식클래스는 할머니,부모 클래스의 것들을 모두 상속 받을 수 있으며, 할머니와 부모클래스의 같은 변수가 있다면 부모클래스를 물려 받게 됩니다.

– 오버로딩이란 무엇인가요

상속이 아닌 하나의 클래스 내에서 이름이 같은 여러개의 메서드를 정의하는 것입니다. 이름이 같기 때문에 호출 시에 구분 방법은 매개변수입니다. 매개변수의 수, 배치(순서), 타입 이 달라야 합니다.

– 상속이란 무엇인가요

기존 클래스의 기능을 유지하면서 추가적인 기능을 추가하여 클래스를 만들고 싶을 때 사용하는 방법은 상속입니다. 새로운 클래스를 생성할 때 상위 클래스를 지정함으로써, 상위 클래스의 모든 기능, 속성을 제공받고 자신의 클래스에는 부가적인 기능, 속성을 추가 할 수 있습니다. 상속은 코드를 간결화하며, 재사용성을 높일 수 있습니다.

– 자바의 데이터 타입에 대해 설명하시오 (Primitive type , Reference type)

기본형은 실제 값을 저장하는 공간을 말하며 종류는 8가지가 있습니다. 이외의 모든 타입을 참조형 이라고 하며 실제 값이 저장된 곳의 주소를 저장하는 공간을 의미합니다.

– 다형성이란 무엇인가요

하나의 클래스나 함수가 다양한 방식으로 동작이 가능한 것을 말합니다. 하나의 메시지가 전달되었을 때 수신자가 누구냐에 따라 각각 다른 기능을 수행합니다. 자바에서 오버로딩, 오버라이딩 등이 있습니다. 쉽게 예를 들면 저는 하나이지만 학교에 있으면 학생이고 집에서는 아들이라는 구성원입니다. 이렇게 생각하면 쉽다고 생각합니다.

– 쓰레드란 무엇인가요

자바 프로그램을 구성하는 명령문은 순서대로 하나씩 처리되는 것이 기본입니다. 이러한 실행흐름을 쓰레드라고 합니다. 둘 이상의 흐름을 갖도록 만들고 싶다면 멀티 쓰레드 프로그램을 사용하면 됩니다.

– 멀티쓰레드란? 장점은 무엇인가요

하나의 프로그램에서 둘 이상의 작업이 필요로 할 때 사용합니다. 자원을 효율적으로 사용가능하며 작업이 분리되어 코드가 간결해 집니다.

– 쓰레드 생성방법이 무엇인가요

첫 번째로는 쓰레드 클래스를 상속받거나 인터페이스를 구현 받는 방법이 있습니다. 두 번째로는 구현한 클래스 내부에서 인스턴스 생성 즉시 쓰레드를 생성시키는 방법이 있습니다.

– 추상클래스란 무엇인가요

하나이상의 추상메서드를 포함한 클래스입니다. 추상클래스는 객체를 생성 할 수 없으며 멤버변수, 일반 메서드, 상수 등도 가질 수 있습니다.

– 인터페이스란 무엇인가요

클래스가 상속을 통해 구현하기에 한계가 있는 경우, 자바에서 불가능한 다중상속을 흉내내기 위한 도구로써 사용됩니다. 추상클래스보다 추상정도가 높으며 추상메서드와 상수만을 가질 수 있습니다. Implements를 통해 구현합니다.

– AOP란 무엇인가요

Aspect Oriented Programing의 약자로 다양한 곳에서 자주 사용되는 공통관심 요소를 단일 기능으로 뽑아내서 코드의 중복을 줄이고 관리의 효율성을 높이기 위해 사용합니다.

– Spring DI란 무엇인가요

Dependency Injection의 약자로 의존성을 주입하는 것을 말합니다. 설정 파일을 통해 객체간의 의존관계를 설정함으로서 객체는 의존하고 있는 객체를 생성하거나 검색 할 필요 없습니다. 그로 인해 코드관리가 편리해집니다.

– 디자인패턴이란 무엇인가요

설계시 반복적으로 나타나지는 설계 방법 또는 구조들을 말합니다. 디자인패턴을 이용하게 되면 코딩이 명확하고 단순하며 모듈을 세분화 시킬 수 있고, 재사용성이 높으며 유지보수가 쉬워집니다. 디자인패턴은 대표적으로 GoF 23가지 패턴이 있습니다. 패턴들의 대부분의 공통점은 추상클래스나 인터페이스로부터 상속받은 클래스를 사용하며, 이는 객체지향의 다형성을 이용한 방법입니다.

– 메모리 상수풀 영역 이란

힙영역(프로그래머가 관리하는 메모리 영역)에 생성되어 자바 프로세스 종료까지 계속 유지되는 메모리영역입니다. 기본적으로 JVM에서 관리하며 프로그래머가 작성한 상수에 대해 최우선적으로 찾아보고 없으면 상수풀에 추가한 이후 그 주소값을 리턴합니다. 그로 인해 메모리 절약 효가가 있습니다.

– main메서드는 왜 static인가요?

static은 메모리 선언을 사용하지 않아도 사용할 수 있습니다. main메서드는 자바가상머신(JVM)에 의해 호출되는 것이므로 반드시 static으로 선언되어 미리 올라가 있어야 합니다. 만일 메모리에 있지 않다면 시작점인 main메서드를 호출하려고 할 때 메모리에 없기 때문에 실행되지 않습니다.

– 캡슐화란 무엇인가요

관련된 데이터와 메서드를 하나의 단위로 묶는 원리입니다. 그로 인해 캡슐내부와 외부를 구별하게 됩니다. 캡슐화를 하게 되면 클래스의 필드 값에 권한을 설정할 수 있습니다. 또한 사용자는 데이터가 클래스에 어떻게 저장되는지 알 수 없습니다. 그리고 클래스의 결합도가 낮아져 재사용이 용이하게 됩니다.

– 직렬화란 무엇인가요

메모리에 있는 객체를 보조기억장치에 저장할 수 있도록 바이트 형태로 변환하는 것을 말합니다. 객체가 생성되어 데이터가 적재되는 메모리는 순간적이기 때문에 영구적으로 보관하기 위해 직렬화를 사용합니다.

– 제너릭이란 무엇인가요

클래스를 선언할 때 타입을 결정하지 않고 객체를 생성할 때 유동적인 타입으로 재사용하기 위한 것을 말합니다.

– 리플렉션이란 무엇인가요

리플렉션은 컴파일러를 무시하고 런타임 상황에서 메모리에 올라간 클래스나 메서드등의 정의를 동적으로 찾아서 조작할 수 있는 일련의 행위를 말합니다. 즉 동적인 언어의 특징이라 말 할 수 있습니다. 프레임워크에서 유연성이 있는 동작을 위해 자주 사용하기도 합니다.

 

 

DB

– ORM이란 무엇인가요

ORM이란 객체와 관계형 데이터베이스을 중간에서 매핑하는 것입니다. SQL만 잘 작성하더라도 충분히 개발 할 수 있지만 SQL를 직접 작성하는 번거로운 작업을 줄여주고, 직접 계산하고 연산하는 부분을 지양해야 하기 때문에 이용됩니다.

– 정규화란 무엇인가요

정규화란 테이블의 데이터들간의 종속성, 중복성 등으로 인해 예기치 못한 오류를 제거 하는 과정이라 할 수 있습니다. 정규화를 진행했을 때 장점은 DB의 일관성을 향상시킬수 있습니다. 또한 DB의 논리적 구조를 견고하게 만들 수 있습니다. 하지만 테이블의 숫자가 늘어나고 결국 join 연산의 비용이 증가 하는 단점을 가질 수 있습니다.

– 무결성 제약조건이란 무엇인가요

데이터의 정확성과 일관성을 보장하기 위해 테이블 생성 시에 각 칼럼에 대해 정의하는 규칙을 의미합니다. 그로 인해 프로그래밍 과정을 줄일 수 있고, 데이터 오류 발생 가능성을 줄여줍니다.

– ERD란 무엇인가요

ERD란 계략적으로 데이터 및 데이터들의 관계를 표현한 도식화된 그림입니다. 조직의 데이터를 이해하고, 이를 응용시스템에 이용하고자 ERD를 작성합니다.

– 컬럼에 인덱스를 생성하는게 좋은지, 생성하지 않는게 좋은지 기술하시오

상황에 따라 다르다고 할 수 있습니다. 인덱스를 생성하려는 컬럼이 분포도가 좋아 활용도가 향상되거나 수정이 빈번하지 않다면 인덱스를 생성하는 것이 좋습니다. 하지만 인덱스 컬럼이 비교되기 전에 변형이 일어난 경우나 부정형으로 조건을 기술한 경우 인덱스를 생성 하지 않는 것이 좋습니다. 지나친 인덱스 선언은 많은 오버헤드(어떤 처리를 하기 위해 들어가는 간접적인 처리시간, 메모리 등을 말한다)를 발생 시킬 수 있습니다.

– 저장 프로시저(stored procedure)란 무엇인가

저장 프로시저란 한 개 이상의 복잡한 SQL Query문들을 데이터베이스에 저장하고 필요한 경우 호출해서 사용하는 객체입니다. 저장 프로시저를 사용 하면 트래픽을 감소 시킬 수 있고, 보안이 강화되며, 코드의 재사용이 가능하며, 유지 관리에 용이합니다.

– DBMS란 무엇인가요

데이터를 적절하고 효율적인 관리의 필요성으로 인해 등장한 체계적으로 데이터를 관리하는 시스템입니다. DBMS를 사용함으로써 사용자 중심의 데이터 처리가 가능하며, 중복성 통제, 데이터의 일관성 유지 등의 장점을 가지고 있습니다. 종류로는 관계형, 객체 지향형, 객체관계형 데이터베이스가 있습니다.

– JOIN은 언제 사용합니까

저희는 데이터 무결성과 중복성, 종속성을 해결하기 위해 테이블을 정규화 시켰습니다. 그렇기 때문에 여러 테이블에서 정보를 필요로 합니다. 그 때 사용하는 것이 JOIN입니다. 당연히 JOIN을 사용하기 위해서는 테이블간의 관계가 설정 되어 있어야 하며 이를 통해 테이블간의 행을 비교 하면서 필요로 하는 정보를 가져 올 수 있습니다.

– Primary key와 Foreign key를 비교하여 설명하시오

Primary key란 테이블에서 각 Row를 유일하게 구분하는 컬럼키입니다. Foreign key는 하나의 테이블에 있는 컬럼으로는 그 의미를 표현 할 수 없는 경우, 다른 테이블의 Primary key를 참조한 값입니다.

– JDBC란 무엇인가요

JDBC란 자바에서 데이터베이스와 관련된 작업을 처리할 수 있도록 도와주는 API입니다. JDBC의 특징을 말씀드리면 DBMS에 의존하지 않습니다. 그 이유는 자바애플리케이션으로부터 사용하는 JDBC드라이버매니저와 DBMS에 의존하는 JDBC드라이버를 분리했기 때문입니다. 또한 표준적인 SQL을 실행하는 메서드를 가지고 있기 때문입니다.

 

728x90
반응형
728x90
반응형

1. Codility란?

A, https://codility.com/tour/

기업 대상 서비스

이 서비스는 주로 구직자의 코딩 실력을 검증하고자 할때 사용됩니다.


B, https://codility.com/programmers/

프로그래머 대상 서비스 

무료 서비스로 알고리즘을 공부하고 문제풀이에 도전해 보고 싶은 분을 위한 것입니다.



2. 프로그래머 대상 서비스 - 알고리즘 테스트

코딜리티


메인화면에서 스크롤을 조금 내리면,

아래 화면을 볼 수 있다.

위 화면에서 [See All Lessons] 버튼 클릭



여러가지 Lesson 목록이 보인다.

Lesson 1 Iterations

아마도 반복문 관련 문제를 제공할것같다.




BinaryGap

START




     

1. 문제 출제 영역( only 영어.... )

- 문제에 대한 설명 및 조건

2. 개발언어 선택 영역

- C, JAVA, PHP 등 여러 프로그래밍 언어 중 선택해서 문제를 풀 수 있다.

3. 코딩 영역

- 실제 자신이 코드를 작성하는 부분

4. 결과 영역

- 자신이 작성한 코드 결과 출력

- 해당 문제에 커스텀 케이스를 대입한 결과 출력

- 문법적 오류 출력




문제를 푼 후

[SUBMIT THIS TASK]

클릭



문제를 풀고난 후 결과창을 통해 자신이 코딩한 소스를 평가 받을 수 있다.

심심할때 한번씩 풀어보면 좋을것같다.



출처: http://hahahoho5915.tistory.com/22?category=653539 [넌 잘하고 있어]

728x90
반응형
728x90
반응형

소수(Prime Number) 

: 1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수


Contents

첫번째n 보다 작은 정수를 나누어 보며 소수 구하는 법

두번째, 1번 방법 마법의 코드 한줄을 통해 실행 시간 단축하는 법

세번째, n 보다 작은 소수를 나누어 보며 소수 구하는 법


첫번째, n 보다 작은 정수를 나누어 보며 소수 구하는 법

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
public class prime {
    public static void getPrime(int num){
        boolean flag;    //소수 판별을 위한 true/false
        int cnt = 0;     //소수의 총 개수를 확인하기 위한 변수
        for(int i=2; i<=num; i++){    //i는 2~num 사이에 정수
            flag = true;
            for(int j=2; j<i; j++){   //j는 i보다 작은 정수
                if(i%j ==0){         //i를 j로 나누었을 때, 나누어 떨어지면 소수가 아님
                    flag = false;
                }
            }
            if(flag == true){
                cnt++;
                System.out.println(i); //소수를 따로 배열에 저장하지 않고, 찾을 때 마다 출력
            }        
        }
        System.out.println("소수 개수 : " + cnt);
    }
    
    public static void main(String[] args){
        long start = System.currentTimeMillis();
        getPrime(30000);
        long end = System.currentTimeMillis();
        System.out.println("실행 시간 : " + (double)(end-start)/1000 + "(s)");
    }
}
cs


실행결과

2

3

5

7

...

29959

29983

29989

소수 개수 : 3245

실행 시간 : 2.214(s)


 30,000개의 정수 중, 소수의 총 개수는 3,245개실행 시간은 2.214초




두번째, 1번 방법 마법의 코드 한줄을 통해 실행 시간 단축하는 법

첫번째 코드의 public static void getPrime(int num){ ~ } 함수 안에 for문을 유심히 보자.

for(int i=2; i<=num; i++){ 

   flag = true;
   for(int j=2; j<i; j++){ 
      if(i%j ==0){        
          flag = false;
      }
   }
   if(flag == true){
      cnt++;
      System.out.println(i); 
   }        
}

i=9일 경우,

for(int j=2; j<i; j++){ 

   if(i%j ==0){        
       flag = false;
   }
}

j=3일 때, 이미 flag 값은 false가 된다. 9는 3의 배수 중 하나이기 때문에 소수가 아니다.


하지만 첫번째 방법의 소수 판별문의 경우, 

이미 flag값이 false가 되어 소수가 아닌 숫자를 찾아내도, 지속적으로 i값 보다 작은 정수를 나누어 보며 비교한다.


필요없는 연산이 계속해서 일어나고 있는 것이다.


이런 필요없는 연산을 줄이기 위한 코드가 있다.

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
public class prime {
    public static void getPrime(int num){
        boolean flag;
        int cnt = 0;    
        for(int i=2; i<=num; i++){
            flag = true;
            for(int j=2; j<i; j++){    
                if(i%j ==0){        
                    flag = false;
                    break; //마법의 코드
                }
            }
            if(flag == true){
                cnt++;
                System.out.println(i);
            }        
        }
        System.out.println("소수 개수 : " + cnt);
    }

    public static void main(String[] args){
        long start = System.currentTimeMillis();
        getPrime(30000);
        long end = System.currentTimeMillis();
        System.out.println("실행 시간 : " + (double)(end-start)/1000 + "(s)");
    }
}
cs

10번 줄의 break문을 추가하여, i가 한 번이라도 j값을 통해 나누어 떨어지면, 

i는 이미 소수의 조건을 박탈, break문을 통해 해당 for문에서 빠져나와 새로운 값의 비교 연산을 진행한다.


실행결과

2

3

5

7

...

29959

29983

29989

소수 개수 : 3245

실행 시간 : 0.254(s)


 30,000개의 정수 중, 소수의 총 개수는 3,245개실행 시간은 0.245초

break; 코드 한 줄을 통해 실행시간이 10배 가까이 단축 된 것을 볼 수 있다.




세번째, n 보다 작은 소수를 나누어 보며 소수 구하는 법

위의 2가지 방법은 

입력 받은 수보다 작은 수들을 나누어보며 떨어지는지 아닌지 판별을 하고 있다.


잘 생각해보면, 우리는 더 좋은 방법을 찾을 수 있다.


4는 2의 배수다. 2는 소수다.

10은 2의 배수, 5의 배수다. 2와 5는 소수다.

21는 3의 배수, 7의 배수다. 3과 7은 소수다.


입력 받은 수 보다 작은 정수들을 다 나누어 볼 필요없이,

입력받은 수보다 작은 수의 소수들만 나누어보면 되는 것이다.

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
import java.util.ArrayList;
 
public class prime {
    public static void getPrime(ArrayList<Integer> prime , int num){
        int cnt = 0;
        prime.add(2);
        for(int i=2; i <= num; i++){
            for(int j=0; j<prime.size(); j++){
                if(i%prime.get(j)==0){
                    break;
                }
                if(j+1 == prime.size()){
                    prime.add(i);
                }
            }
        }
        for(int i = 0; i<prime.size(); i++){
            cnt++;
            System.out.println(prime.get(i));
        }
        System.out.println("소수 개수 : " + cnt);
    }
    public static void main(String[] args){
        long start = System.currentTimeMillis();
        ArrayList<Integer> prime = new ArrayList<Integer>(); 
        getPrime(prime, 30000);
        long end = System.currentTimeMillis();
        System.out.println("실행 시간 : " + (double)(end-start)/1000 + "(s)");
    }
}
cs


실행결과

2

3

5

7

...

29959

29983

29989

소수 개수 : 3245

실행 시간 : 0.072(s)


 30,000개의 정수 중, 소수의 총 개수는 3,245개실행 시간은 0.072초

첫번째 코드 보다는 30배 가까이,

두번째 코드 보다는 3배 가까이 실행 시간이 단축 된 것을 볼 수 있다.




3가지 방법 정수의 개수에 따른 실행 속도 비교

1000개 까지의 정수 중 소수를 판별하기 위한 실행속도는 방법별로 큰 차이는 보이지 않는다.

하지만 숫자가 커지면서 방법 별 실행속도의 차이는 눈에 띄게 차이가 나는 것을 볼 수 있다.



출처: http://hahahoho5915.tistory.com/14?category=653539 [넌 잘하고 있어]

728x90
반응형

'Web Programming > java-jsp' 카테고리의 다른 글

신입 자바 개발자 면접 질문  (0) 2018.08.29
Codility 자바 코딩실력 검증  (0) 2018.08.29
java 선형 큐(Linear Queue)  (0) 2018.08.29
java 퀵 정렬(Quick Sort)  (0) 2018.08.29
java 삽입 정렬(Insertion Sort)  (0) 2018.08.29
728x90
반응형

FIFO - First In First Out(선입선출)

인큐(EnQueue)를 통해 자료 입력, 디큐(DeQueue)을 통해 자료 출력


* 매표소, 가장 먼저 줄서있는 사람에게 표를 먼저 제공한다.



* 선형 큐 알고리즘은 Rear가 배열의 끝에 닿아 있으면, 앞에 배열의 빈 부분(Q[0])이 남아 있어도 더이상 삽입연산을 하지 못한다.

메모리를 효율적으로 관리하지 못함. 이러한 문제점을 해결하기 위해 원형 큐가 만들어졌다.


JAVA 소스코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import java.io.InputStream;
import java.util.Scanner;
 
public class Queue {
    
    private int front;
    private int rear;
    private int maxSize;
    private Object[] queueArray;
    
    //Queue 생성
    public Queue(int maxSize){
        this.front = 0;
        this.rear = -1;
        this.maxSize = maxSize;
        this.queueArray = new Object[maxSize];
    }
    
    //Queue 비었는지 확인
    public boolean empty(){
        return (front == rear+1);
    }
    
    //Queue 꽉 찼는지 확인
    public boolean full(){
        return (rear == maxSize-1);
    }
    
    //Queue에 item 입력
    public boolean enqueue(Object item){
        if(full()){
            System.out.println("Queue is FULL!!");
            return false;
        }
        queueArray[++rear] = item;
        return true;
    }
 
    //Queue 가장 먼저들어온 데이터 출력
    public Object dequeue(){
        if(empty()){
            System.out.println("Queue is EMPTY!!");
            return null;
        }else{
            Object item = queueArray[front];
            queueArray[front] = null;
            front++;
            return item;
        }
    }
    
    //Queue 출력
    public void printQueue(Queue queue){
        if(!empty()){
            for(int i = 0; i<maxSize; i++ ){
                if(queue.queueArray[i] == null){
                    System.out.print("|\t\t");
                }else{
                    System.out.print("|\t"+ queue.queueArray[i]+ "\t");
                }
            }
            System.out.println(" |");
        }else{
            System.out.println("큐 비어있음");
        }    
    }
    
    public static void main(String[] args) {
 
        InputStream a = System.in;
        Scanner sc = new Scanner(a);
        
        System.out.println("큐 SIZE 입력 : ");
        int size = sc.nextInt();
        Queue arrayQueue = new Queue(size); //create queue
        
        boolean flag = true;
        
        while(flag){
            menu();
            String s = sc.next();
            switch(s){
            case "1":
                System.out.print("ENQUEUE : ");
                String data = sc.next();
                arrayQueue.enqueue(data);
                break;
            case "2":
                System.out.println("DEQUEUE : " + arrayQueue.dequeue());
                break;
            case "3":
                arrayQueue.printQueue(arrayQueue);
                break;
            case "q":
            case "Q":
                flag = false;
                break;
            }
        }
    }
    public static void menu(){
        System.out.println("1. enQueue");
        System.out.println("2. deQueue");
        System.out.println("3. QUEUE");
        System.out.println("Q. 종료");
    }
}
cs



출처: http://hahahoho5915.tistory.com/11?category=653539 [넌 잘하고 있어]

728x90
반응형

'Web Programming > java-jsp' 카테고리의 다른 글

Codility 자바 코딩실력 검증  (0) 2018.08.29
java 소수 구하기 + 실행시간 단축  (0) 2018.08.29
java 퀵 정렬(Quick Sort)  (0) 2018.08.29
java 삽입 정렬(Insertion Sort)  (0) 2018.08.29
java 버블 정렬(Bubble Sort)  (0) 2018.08.29

+ Recent posts