네이버 클라우드 부트캠프/복습 정리

15일차 [ java 총 정리, 면접 ]

유정♡ 2024. 3. 12. 12:13
코딩테스트 할 때는 입력 스캐너 대신 BufferedReader 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) 
int n = Integer.parseInt(br.readLine());

 

 

 


[ 코드 복습 ]

 

강제 타입 변환과 자동 타입 변환
Scanner 복습

 

Scanner와 While문 사용
5개의 정수형 배열 생성 선언과 Max 값 찾기

 

배열 {1, 2, 3, 4, 5} for-each문으로 출력

 

배열 {1, 2, 3, 4, 5} pr() 함수 활용

 

 

※ 생성자는 리턴타입 반환형이 없음 !! 클래스 하나에 생성자 갯수 제한 없음

함수 호출과 동시에 출력

 

객체에 값을 넣는 대신 객체 생성할때 생성자에 값을 넣어줌

 

this(a,5); -> 매개변수가 2개인 생성자를 호출해라 / this(10); -> 매개변수가 1개인 생성자를 호출해라 근데 그 생성자가 this(a,5) !!!

 

 ※ 클래스에서 static으로 함수를 만들면 main() 에서 객체 생성 없이 클래스를 통해 바로 접근 가능

삼항연산자와 static 사용법

※ super() 는 무조건 첫 줄에 와야 함 !!!

메소드 오버라이딩

 

※ abstract 메서드는 반드시 abstract class 안에 위치해야함

abstract class와   abstract 메서

 

※ interface의 final 상수선언과 추상메서드 / 인터페이스를 상속받은 추상메서드는 public 붙여야 함 !!!

interface 안의 추상메서드와 final 상수선언 그리고 interface 상속 받는 메서드는 항상 public 붙이기
class 이름을 알아내는 함수와 String toString 함수 사용

 

 

boxing과 unboxing

 

※ 정수를 문자열로 바꾸는 작업 toString | 문자열을 정수로 바꾸는 함수 parseInt

parseInt과 toString 중요 !! valueOf는 잘 사용하지 않음

 

Vector 응용
Vector 응용 for문과 Iterator를 활용하여 출력하기
HashMap<K, V> 응용 Iterator로 출력하기
스레드를 상속 받는 방벙 ( 1 ) - extends Thread
스레드를 상속 받는 방벙 ( 2 ) - implements Runnable
스레드 synchronized
FileWriter를 활용하여 "c.txt"에 문자열 저장 ( 입력 종료 -> Ctrl+z )
FileOutputStream을 활용하여 "temp.txt"에 byte[] 배열 저장
FileInputStream을 활용하여 "temp.txt"에 저장된 byte [] 콘솔창에 출력하기

 

DataOutputStream과, DataInputStream

[ 객체 배열 추상 클래스 ]

abstract class Profile{  //추상클래스
	abstract void add(String name, String id); //추상메서드
	abstract String check(String id);
}
class Person{
	String name,id;
	Person(String n, String i){
		name=n; id=i;
	}
	public String getName() {
		return name;
	}
	public String getId() {
		return id;
	}
}
class Per extends Profile{
	Person[] ary;  //객체 배열 선언
	int n;
	
	Per(int n){  //생성자 
		ary=new Person[n];  //배열 생성하고 있음
	}
	void add(String name, String id) {
		ary[n]=new Person(name,id);  //객체 생성 코드
		n++;
	}
	 String check(String id) {
		 for(int i=0;i<n;i++) {
			 if(id.compareTo(ary[i].getId())==0){
				 return ary[i].getName();
			 }
		 }
		 return null;
	 }
}
public class Test {
	public static void main(String[] args) {
		
		Profile p=new Per(5); //up
		p.add("현욱","123"); //ary[0].name ary[0].id
		p.add("예준","456"); //ary[1].name ary[1].id
		p.add("태경","457"); //ary[2].name ary[2].id
		
		System.out.println(p.check("123"));
		System.out.println(p.check("456"));
		System.out.println(p.check("457"));
		
	}
}

 

[ ObjectOutputStream ObjectInputStream ]

import java.io.*;
class Stu implements Serializable{
	private String name;
	private String id;
	private int age;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
public class Test {
	public static void main(String[] args) throws IOException {

		ObjectOutputStream os=null;
		
		try {
			os=new ObjectOutputStream(new FileOutputStream("ob.dat"));
			
			Stu s=new Stu();
			s.setName("길동");
			s.setId("123");
			s.setAge(22);
			
			os.writeObject(s); //직렬화 
			
		}catch(Exception e) {}
		os.close();
		
		ObjectInputStream in=null;
		
		try {
			in=new ObjectInputStream(new FileInputStream("ob.dat"));
			Stu s=(Stu)in.readObject();  //형변환 역직렬화
			
			System.out.println(s.getName());
			System.out.println(s.getId());
			System.out.println(s.getAge());
		}catch(Exception e) {}
		in.close();
		
	}
}​
import java.io.*;
class Rec implements Serializable{
	int a,b;
	Rec(int a, int b){
		this.a=a;
		this.b=b;
	}
	void show() {
		System.out.println(a+" "+b);
	}
}
public class Test {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		//역직렬화
		ObjectInputStream in=new ObjectInputStream(new FileInputStream("obj.dat"));
		Rec r1=(Rec)in.readObject();
		Rec r2=(Rec)in.readObject();
		String r3=(String)in.readObject();
		
		r1.show();
		r2.show();
		System.out.println(r3);
		
		
		ObjectOutputStream os=null;
		os=new ObjectOutputStream(new FileOutputStream("obj.dat"));
		
		//Rec r=new Rec(4,7);
		os.writeObject(new Rec(4,7));
		os.writeObject(new Rec(8,5));
		os.writeObject(new String("glgl"));
		
		os.close();
	}
}

 

[ Sever와 Client Socket ]

import java.io.*;
import java.net.*;
import java.util.*;

public class Server { // 서버쪽
	public static void main(String[] args) {
		
		BufferedReader in = null;
		BufferedWriter out = null;
		ServerSocket listener = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in); // 키보드에서 읽을 scanner 객체 생성
		
		try {
			listener = new ServerSocket(9999); // 서버 소켓 생성
			System.out.println("연결을 기다리고 있습니다.....");
			socket = listener.accept(); // 클라이언트로부터 연결 요청 대기
			System.out.println("연결되었습니다.");
			
			///////// 밑에서 부턴 데이터 보내는 작업 /////////////
			
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			while (true) {
				String inputMessage = in.readLine(); // 클라이언트로부터 한 행 읽기
				if (inputMessage.equalsIgnoreCase("bye")) { //대소문자 관계없다는 함수
					System.out.println("클라이언트에서 bye로 연결을 종료하였음");
					break; // "bye"를 받으면 연결 종료
				}
				System.out.println("클라이언트: " + inputMessage);
				System.out.print("보내기>>"); // 프롬프트
				String outputMessage = scanner.nextLine(); // 키보드에서 한 행 읽기
				out.write(outputMessage + "\n"); // 키보드에서 읽은 문자열 전송
				out.flush(); // out의 스트림 버퍼에 있는 모든 문자열 전송
			}
			
		} catch (IOException e) { System.out.println(e.getMessage());
		
		} finally {
			try {
				scanner.close(); // scanner 닫기
				socket.close(); // 통신용 소켓 닫기
				listener.close(); // 서버 소켓 닫기
				
			} catch (IOException e) { 
            	 System.out.println("클라이언트와 채팅 중 오류가 발생했습니다."); }
		}
	}
}

 

import java.io.*;
import java.net.*;
import java.util.*;

public class Client { // 클라이언트쪽
	public static void main(String[] args) {
		BufferedReader in = null;
		BufferedWriter out = null;
		Socket socket = null;
		Scanner scanner = new Scanner(System.in); // 키보드에서 읽을 scanner 객체 생성
        
		try {
			socket = new Socket("localhost", 9999); // 클라이언트 소켓 생성. 서버에 연결
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            
			while (true) {
				System.out.print("보내기>>"); // 프롬프트
				String outputMessage = scanner.nextLine(); // 키보드에서 한 행 읽기
				if (outputMessage.equalsIgnoreCase("bye")) {
					out.write(outputMessage + "\n"); // "bye" 문자열 전송
					out.flush();
					break; // 사용자가 "bye"를 입력한 경우 서버로 전송 후 실행 종료
				}
				out.write(outputMessage + "\n"); // 키보드에서 읽은 문자열 전송
				out.flush(); // out의 스트림 버퍼에 있는 모든 문자열 전송
                
				String inputMessage = in.readLine(); // 서버로부터 한 행 수신
				System.out.println("서버: " + inputMessage);
			}
            
		} catch (IOException e) {
			System.out.println(e.getMessage());
            
		} finally {
        
			try {
				scanner.close();
				if (socket != null)
					socket.close(); // 클라이언트 소켓 닫기
                    
			} catch (IOException e) {
				System.out.println("서버와 채팅 중 오류가 발생했습니다.");
                
			}
		}
	}
}

 


 

[ 면접 질문 & 대답 ] 

[ 연산자 ]

++i : i의 값을 1 증가시킴 

i++ : 다른 연산을 수행한 후 i의 값을 1 증가시킴

 

[ 조건문과 반복문 ]

if문  / switch문 / for문 / while문

[ 참조 타입 ]

※ 데이터 타입 분류 : 자바의 데이터 타입은 크게 기본타입(primitive type)과 참조타입(reference type)으로 분류한다.

※ 기본타입과 참조타입의 차이점 :

      → 기본타입은 변수에 값 자체를 저장 

      → 참조타입은 메모리상 객체가 있는 위치를 저장

 

[ 배열 ]

※ 배열과 ArrayList의 공통점과 차이점 :

      →  공통점은 둘 다 데이터 타입이 모두 같은 하나이상의 값을 저장할 수 있는 배열과 참조타입.

      →  차이점은 배열은 고정길이 때문에 초기에 배열 크기를 정해야 한다 

                            ArrayList는 동적으로 추가적인 데이터 할당이 가능하다.

배열 선언하는 세 가지 방법

배열은 for문 보단 for-each문 주로 사용

배열의 최대값 최소값 구하기 해보기 

 

☆★ [ 클래스 ] ★☆

객체란? : 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것을 말한다. 

클래스와 객체 메서드를 설명할 수 있어야 한다.

객체 : 물리적으로 존개하거나(사물) 개념적으로 식별 가능한 것

클래스 : 공통된 속성과 기능을 갖는 객체 집합 (필드-객체 데이터 저장하는 역할, 생성자-new연산자로 객체를 생성할 때 객체의 초기화 역할, 메서드-객체와 객체 간의 상호작용)

메서드: 객체가 실행해야 할 기능

 

객체 지향 프로그램 특징  

캡슐화 : 객체의 속성(=필드)과 기능을 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉하는 것 (접근제한자).

은닉을 하는 이유는 외부 사용으로부터 객체 손상되지 않게 하기 위해서 이다. 보통 필드는 캡슐화한다.

상속 : 새로운 클래스가 기존 클래스의 필드, 생성자, 메서드 이용할 수 있게 하는 기능 => 상속의 장점 코드의 재사용성을 높여주고 유지보수 시간 최소화 시켜준다. 프로젝트 때 사용한 상속의 예를 들며 대답하기 클린코드 형태가 되었다, 중복된 코드가 사라져서 코드가 클린코드가 되었다, 유지보수 시간이 줄어들었다, 

다형성 : 사용방법은 같지만 결과가 다양하게 나온다. - 즉 상위클래스에 있는 메서드를 오버라이딩 할 때, 하위클래스에서는 메서드의 기능이 달라진다. -> 업/다운 캐스팅 연결해서 대답. ( 형변환을 해서 하위 클래스를 상위클래스로 변경을 하면서 다형성이라는 개념을 인식했다 )

추상화 : 공통의 속성이나 기능을 묶어 추상클래스로부터 만들어 사용

 

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

      →  오버로딩 : 함수의 재정의 (함수의 이름만 동일하고 매개변수가 달라야 한다. (매개변수의 수, 배치순서)

특정 클래스 내에서 이름이 같은 메서드를 여러 개 중복해서 정의한 것. 

      →  오버라이딩 : 상위 클래스의 함수 재정의 ( 함수이름, 매개변수, 반환형 그대로 가져와서 재정의 해야 함)

상속 super

접근제한자

private : 같은 클래스 내에서만 접근 가능

default : 같은 패키지 내에서만 접근 가능

protected : 같은 패키지 내에서, 그리고 다른 패키지의 자식 클래스에서 접근 가능

public : 접근 제한이 없다

public -> protected -> default -> private

 

call by value & call by reference

call by reference : 매개변수의 주소에 값을 저장하는 방식. 클래스 객체를 인수로 전달한 경우 

call by value : 인수로 기본 데이터형을 사용 

Pr(Person p)

Pr(int p)

 

싱글톤-> 프로젝트 연결해서 대답

 

[ 인터페이스 ]

abstract와 interface 차이 : abstract는 (추상 클래스 추상메서드가 보통 하나 이상 나옴 실행이 안 되는 함수 선언만 한 메서드) 추상클래스/추상메서드를 한 개 이상 포함하고 있는 클래스를 의미 둘 다 객체 생성을 할 수 없다 abstract는 상속 (extends) 개념으로 사용되고 interface는 구현(implement) 개념으로 사용된다. 다중상속의 목적이 되냐 안 되냐. abstract는 다중상속 안 되고 interface는 다중 상속 가능. 둘 다 상속받은 클래스에서 오버라이딩 하여 사용한다. 

 

[ 컬렉션 자료구조 ]

라이브러리 프레임워크 차이점 

라이브러리 : 자바에서 쓰는 기능을 모아놓은  유틸 모음집

프레임워크 : 일정 수준 이상의 품질을 보증하는 코드를 비교적 빠르고 편하게 완성, 유지 보수 할 수 있는 솔루션.

 

자바컬렉션의 대표 인터페이스 같은 타입 참조값을 여러 개 저장하기 위한 라이브러리 

List : 중복허용하고 순서 가진다

Set : 중복허용하지 않고 순서 가지지 않는다. 프로젝트에서는 어느 부분에 ~~ 이걸 사용했는지 연결해서 말하기

Map : key value 의 형태로 저장한다. key 값은 중복을 허용하지 않는다.

 

[ 멀티 스레드 ]

스레드와 프로세스 

스레드 : 하나의 프로그램 내에서의 실행 단위로 프로세스 내에 존재한다.

프로세스 : 실행 중인 프로그램

운영체제 내에서 존재한다 

보통 멀티스레드를 사용하는데 한 프로그램에서 여러 실행 흐름이 있어, 동기화 방법을 이용해야함

(wait/notify.synchronize 함수와 블록, join 일시정지 메서드) - 프로젝트와 연결해서 설명

 

 

 

자바 &amp; DB 총정리 면접준비.pdf
0.18MB

728x90