Java 면접 대비 정리

jaeuk yoo·2020년 11월 23일
0

신입 자바 개발자가 갖춰야 할 기본 지식이라 생각하는 이론요소들을 정리해보았습니다.
수정할 부분이 있거나 추가로 알아야하는 것들이 있다면 댓글로 작성 부탁드려요.


Java 란 ?

  • 자바는 객체 지향 프로그래밍 언어(OOP) 입니다.
  • OOP란 프로그래밍 방법론 중 하나로,
    공통된 기능들을 하나의 객체로 묶어서 사용하는 것을 의미합니다.
    • 반대되는 개념은 절차지향 방법론으로,
      프로그램이 실행되는 절차에 따라 작성됩니다.
  • OOP를 사용하면 재사용성이 높아지고 유지보수도 편해집니다.
  • 객체는 클래스의 new 생성자로 만듭니다.( Person 애쉬 = new Person )
  • 이렇게 만든 인스턴스는 heap영역에 들어갑니다.
// Java에서의 객체는 아래와 같이 Class로 정의됩니다.
class Test{

}

Q. OOP를 사용하면 왜 재사용성이 높아지고 유지보수가 편해져요 ?

프로그래밍 구조가 크고 복잡해질 수록 개발자 혼자서 하나부터 열까지 코딩하는 것은 한계가 있을겁니다.
이때, 우리가 바탕화면의 파일들을 폴더로 관리하듯이 관리를 한다면
그것도 공통된 기능별로 묶어서 관리를 한다면
차후 다른 프로젝트에 같은 파일을 그대로 옮겨다 변수만 바꿔 사용하는 등 작업 효율이 높아질거에요.
또한 기능A를 수정하는 과정에서 다른 기능들까지 수정해야하는 등의 번거로움도 덜 수 있을거에요.

객체(개체)란 ?

객체(Object)는 소프트웨어 세계에 구현할 대상이고, 이를 구현하기 위한 설계도가 클래스(Class)이며, 이 설계도에 따라 소프트웨어 세계에 구현된 실체가 인스턴스(Instance)이다.

  • 객체(Object)는 현실의 대상(Object)과 비슷하여, 상태나 행동 등을 가집니다.
    그러나 소프트웨어 관점에서는 그저 사유의 결과(concept)일 뿐입니다.
    소프트웨어에서 객체를 구현하기 위해서는 concept 그 이상으로 많은 것들을 사고하여 구현해야 합니다.

    인간의 사고 - 먹는다 : 젓가락으로 라면을 먹는다.
    컴퓨터의 사고 - 라면을 먹는다 : 라면의 좌표를 찾는다 ->
    젓가락의 좌표를 찾는다 -> 젓가락을 든다 -> 젓가락의 각도를 ...

  • 이를 위한 설계도로 클래스를 작성합니다. 설계도를 바탕으로 객체를 소프트웨어에 실체화 하면 그것이 인스턴스(Instance)가 되고, 이 과정을 인스턴스화(instantiation)라고 합니다. 실체화된 인스턴스는 메모리에 할당됩니다.

*코딩을 할 때, 클래스 생성에 따라 메모리에 할당된 객체인 인스턴스를 ‘객체’라고 부르기도 합니다. 이는 틀린 말이 아니에요.

*인스턴스라고 부르면 더 정확하지만, 개념적으로 인스턴스는 객체에 포함된다고 볼 수 있기 때문이에요.
( 인스턴스 ⊃ 객체 )


객체지향언어의 특징


추상화

  • 추상화의 사전적 의미는 특정한 개별 사물과 관련되지 않은 공통된 속성이나 관계 등을 뽑아내는 것입니다.
  • 이를 컴퓨터 관점에서 생각해보면, 추상화란 데이터나 프로세스 등을
    의미가 비슷한 개념이나 표현으로 정의해 나가는 과정이면서 동시에 각 개별 객체의 구현에 대한 상세함은 감추는 것, 이것이 추상화라고 할 수 있습니다.
  • 상속, 캡슐화의 코드은닉 과 같은 다른 특성. 반복문 과 같은 문법 또한 추상화의 한 종류입니다.

보다 구체적인 예시를 원한다면 '반복문 추상화', '클래스 추상화', '추상 자료형' 등을 검색해보세요.


상속

  • 상속 inheritance :
    부모클래스의 재산(클래스가 가진 요소, field & method)을 자식클래스가 사용하는 것을 의미합니다.

  • 여기서 주체성을 가진 것은 자식쪽입니다.
    자식(클래스)이 상속받고 싶은 부모(클래스)를 선택합니다.
    자식은 부모에게 물려받은 자산(field, method)중 본인이 필요한 요소만 선택 사용 가능합니다.

    • *단, 접근제한자가 private를 갖는 필드나 메소드는 상속받을 수 없습니다.
      패키지가 다를 경우 접근제한자가 default인 경우도 상속받을 수 없습니다.
  • 상속의 장점은 중복코드를 줄일 수 있고, 유지보수가 편리하며, 통일성이 있고, 다형성을 구현할 수 있다는 점이 있습니다.

  • 자바에서는 자식클래스가 한 부모클래스에게서만 상속받을 수 있습니다.
    그러나 부모클래스는 여러 자식클래스에게 상속 가능합니다.

// 상속의 방법(선언) - extends
class (자식)클래스명 extends (상속받을 부모)클래스명{...}

다형성

  • 다형성 polimorphism :
    객체를 같은 자료형에 여러 가지 객체를 대입하여
    다양한 결과를 얻어내는 성질을 의미합니다.
  • 예1) Overload ( 한 클래스에 동일한 메소드명들(인자는 모두 다름) )
public class Print { // 사용클래스
  public static void main(String[] args){ // 프로그램의 주 진입점
      Overload overload = new Overload(); // 선언
      overload.cal();
      overload.cal(1,10); 
      overload.cal(7);
  }
}

class Overload{
  // 오버로딩, 인자 0
  public void cal(){ System.out.println("인자(인수) X") } 
  // 오버로딩, 인자 1
  public void cal(double d){ System.out.println(d) }
  // 오버로딩, 인자 2
  public void cal(int a, int b){ System.out.println(a+b) }
  
}
  • 예2) Override ( 메소드 동작 재정의 )
// 인터페이스
interface MenuIngredients{ 
  void foodName(); // 추상 메소드
  void mainIngredients(); // 추상 메소드
  void subIngredients(); // 추상 메소드
}

// 인터페이스 구현 클래스
class MenuChicken implements MenuIngredients{ 
  public void foodName(){ // 오버라이딩
  	System.out.println("메뉴는 치킨 입니다.");
  }
  public void mainIngredients(){ // 오버라이딩
  	System.out.println("주재료 : 닭고기");
  }
  public void subIngredients(){  // 오버라이딩
  	System.out.println("부재료 : 튀김가루, 식용유");
  }
}

// 인터페이스 구현 클래스
class MenuSteak implements MenuIngredients{ 
  public void foodName(){ // 오버라이딩
  	System.out.println("메뉴는 스테이크 입니다.");
  }
  public void mainIngredients(){ // 오버라이딩
  	System.out.println("주재료 : 소고기");
  }
  public void subIngredients(){  // 오버라이딩
  	System.out.println("부재료 : 마늘,아스파라거스");
  }
}

// 사용 클래스
public class Cook{
  public static void main(String[] args){ // 프로그램의 주 진입점
    MenuIngredients menu; // 인터페이스 객체 선언
    
    System.out.println(" 메뉴를 선택해주세요(1. 치킨 2. 스테이크 ) ")
    Scanner sc = new Scanner(System.in); // 스캐너 객체
    int n = sc.nextInt();
    if(n==1){ 
      menu = new MenuChicken();  // 업캐스팅
    } else if(n==2){
      menu = new MenuSteak(); // 업캐스팅
    } else{
      System.out.Println("존재하지 않는 메뉴입니다.");
    }
    
    // 선택한 조건에 따라서 부모객체로 자식메소드를 사용합니다.(다형성)
    menu.foodName();
    menu.mainIngredients();
    menu.subIngredients();
  }
}

캡슐화

  • 캡슐화 encapsulation :
    코드은닉, 중요한 데이터,코드를 보호하기 위해 외부에서 접근을 제한합니다.

  • 캡슐화 방법

    1. 멤버 변수 앞에 접근 제한자 private사용.
    2. 멤버 변수에 값을 넣고 꺼내 올 수 있는 메소드를 만든다 (접두어 set/get을 사용해 메소드를 만든다.)
public class student{
  private String name;
  private int id;
  private int age;
   
  public void setName(String name){
      this.name = name;  }
 
  public void setId(int id){
      this.name = name;  }
 
  public void setAge(int age){
      this.name = name;  }
 
  public void getName(){
     return name;  }
 
  public void getId(){
      return id;  }
 
  public void getAge(){
     return age;  }
 }


자바의 기초


type 변수 = 값;
기본타입 == 원시타입 : call by value

  • 정수형(byte short int long) / 실수형(float double) /
    문자형(char) / 논리형(true/false) +문자열(2∝)
  • 형 변환, wrapper class : 기본타입에 기능추가
    명시적(downCasting) / 묵시적(upCasting)
  • 참조타입 : call by reference
    오브젝트를 상속받은 모든 클래스 /
  • 예) Score와 같은 것.

메모리 영역


  • 객체는 기본적으로 heap영역에 만들어짐.
  • 문자열은 heap영역의 StringPool에 값이 만들어짐.
    new 문자열은 객체 만들듯이 heap영역에 만들어짐.
  • Stack영역에는 기본타입, 변수가 만들어짐
  • static영역에는 클래스, static으로 선언된 변수,
    메서드(명)가 만들어짐

메소드 (public static void Main(String[] args){}


  • 기능 / 명령문들의 집합
  • 접근제한자 / 메모리 / 리턴 / 메소드명(파람/아규){
    }
  • 접근제한자 : 객체 멤버로의 접근 제한 (+/#/~/-)
  • 메모리영역 : static / non-static
  • 리턴타입 : 모든 리턴되는 타입과 void
  • 메소드명 : 메소드 명 이름
  • 파라미터 : parameter, 매개변수
  • 아규먼트 : argument, 인수

연산자 (연산우선순위 / 증감 / 삼항 / 비트 )


  • 자바에서의 연산자는
    단항, 이항, 삼항, 대입 연산자로 구분
  • 이항 연산자는
    산술, 비교, 논리 연산자로 구분
  • 연산우선순위 :
    괄호 → 부정,증감 → 곱셈 → 덧셈 →
    비트관계 → 관계 → 비트논리 → 논리
  • 증감연산자 :
    전위 : 리턴 전 연산 (++a / - -a)
    후위 : 리턴 후 연산 (a++/ a- -)
  • 예)

제어문


  • 반복문 : for(횟수) while(조건)
  • 조건문 : if, switch조건~case값
    switch 조건 : 식 or 값 && 정수 or 문자형 사용 가능.
    자바1.7부턴 문자열도 가능.

배열


  • 공통된 여러개의 값을 효과적으로 관리하기 위한 객체
  • 최초 생성 시 배열크기 선언
  • 배열 값을 복사할건지 (새로운 배열객체)(deep copy) /
    배열 주소값을 복사할건지 (shallow copy)
  • 다차원으로 생성 가능

컬렉션


  • 여러개의 값을 효과적으로 관리하기 위한 객체
  • 크기는 가변적
  • list / set / map
  • map.entry : 키 따로 밸류 따로
  • iterator : 컬렉션에 있는 값을 조회할 수 있게 해주는 객체

——————————————————————————————
객체의 정렬기준을 명시하는 두가지 방법——————————————————————————————

  • 정렬 수행 시 기본적으로 적용되는 정렬 기준이 되는 메서드를 정의하는 인터페이스
  • comparable / compare to : 비교되는 객체 내부에 만들어야함
  • ( - ) : 현재 객체 < 파라미터로 넘어온 객체
    ( 0 ) : 현재 객체 == 파라미터로 넘어온 객체
    ( + ) : 현재 객체 > 파라미터로 넘어온 객체
    ————— ————— ————— —————
    리턴 값이
    음수or 0이면 객체의 자리가 그대로 유지되며,
    양수인 경우에는 두 객체의 자리가 바뀐다.
    ————— ————— ————— —————

——————————————————————————————

  • 정렬 가능한 클래스(Comparable 인터페이스를 구현한 클래스)들의 기본 정렬 기준과 다르게 정렬하고 싶을 때 사용하는 인터페이스
  • comperator / compare : 두 객체를 비교
  • ( - ) : parameter1 < parameter2
    ( 0 ) : parameter1 == parameter2
    ( + ) : parameter1 > parameter2

제네릭


  • <> , 제네릭 : 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법
  • 타입 고정 : 형변환에서의 문제 발생 || 프로그램 흐름 중에 타입이 섞여 에러가 발생할 수 있기에.

String


  • String 클래스 객체, new String 객체

    • 참조타입이지만 기본타입처럼 사용 가능.
    • String은 다른 영역에 저장된다. (StringPool)
    • 불변, String 클래스로 생성된 객체가 변경되면 기존의 String 객체는 더이상 참조하지 않고 새로운 String 객체가 생성된다는 의미
  • String객체 예시

  • StringBuffer()

    • for(){.append}와 같은 행위에서 메모리가 낭비되는 것을 방지하기 위해 고안된 클래스
  • 예시

  • StringBuilder()

    • StringBuffer()와 유사하게 고안된 클래스
    • 그러나 싱글쓰레드로 가정하고 만들어, 쓰레드safe하지 않다.

예외처리 exception

  • 참조

※ 들어가기 전에...
throw : exception(예외)를 발생시키는 애
throws : exception을 미루는 애
exception 처리하는 이유 : 오류가 나서 프로그램이 비정상 종료되는 것을 막기 위해


Checked Exception, Unchecked Exception 차이

  • <사진>

  • Error

    • 시스템이 비정상적인 상황에서 발생 (시스템 레벨에서 발생하는 심각한 수준의 오류)
  • Unchecked Exception (runtime exception)

    • 개발자의 실수, 런타임시 발생하는 오류
    • 예외처리를 강제하지 않는 예외들.
    • catch로 잡거나 throw로 호출한 메서드로 예외처리를 해주지 않아도 상관없음

Ex) numberFormat / nullpoint

  • Checked Exception
    • Java 컴파일 시(저장 시) 자동으로 체크해주는 오류
    • 반드시 명시적으로 처리해야 하는 예외들.

Ex) java.io/java.sql 패키지 예외처리

Checked, Unchecked은 개발자들이 만든 애플리케이션 코드에서
예외가 발생했을 경우에 사용하게 됩니다.

  • Checked Exception, Unchecked Exception 차이 표로 보기

  • 자바 7 이전까지의 방법 : try-catch-finally
  • 자바 7 부터 지원하는 방법 : try-with-resources

io : input/outputStream이 기본. byte값의 연속적인 흐름

(람다식 예쁘게 쓸때 써먹는 람다스트림도 있습니다.)


thread : 프로그램과 프로세스(실행 중인 프로그램) 쓰레드(프로세스의 기본작업단위)


network : TCP/UDP --네트워크 7계층 봐야함.
TCP : 보내고 받고 보내고 받고.
UDP : 일단 보내기만해요.



도움을 주신 분들

  • 이 동헌 선생님

객체 관련

티스토리 아이디어 저장소 - 001. 객체와 인스턴스의 차이



추상화 관련

티스토리 자바캔 - 추상화란?

  • '로그 수집'을 예시로 한 코드풀이를 통해 추상화와 다형성을 잘 설명해주셨습니다.

티스토리 HCR Daily - 프로그래밍 언어에서의 추상화

  • 추상화를 '자료 추상화'와 '제어 추상화' 란 두 가지 범주로 나누어 심플하게 설명해주셨습니다.

profile
공부한 내용을 정리하겠습니다.

0개의 댓글