15일차 [ java 총 정리, 면접 ]
코딩테스트 할 때는 입력 스캐너 대신 BufferedReader 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in))
int n = Integer.parseInt(br.readLine());
[ 코드 복습 ]
※ 생성자는 리턴타입 반환형이 없음 !! 클래스 하나에 생성자 갯수 제한 없음
※ 클래스에서 static으로 함수를 만들면 main() 에서 객체 생성 없이 클래스를 통해 바로 접근 가능
※ super() 는 무조건 첫 줄에 와야 함 !!!
※ abstract 메서드는 반드시 abstract class 안에 위치해야함
※ interface의 final 상수선언과 추상메서드 / 인터페이스를 상속받은 추상메서드는 public 붙여야 함 !!!
※ 정수를 문자열로 바꾸는 작업 toString | 문자열을 정수로 바꾸는 함수 parseInt
[ 객체 배열 추상 클래스 ]
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연산자로 객체를 생성할 때 객체의 초기화 역할, 메서드-객체와 객체 간의 상호작용)
메서드: 객체가 실행해야 할 기능
객체 지향 프로그램 특징
캡슐화 : 객체의 속성(=필드)과 기능을 하나로 묶고 실제 구현 내용 일부를 외부에 감추어 은닉하는 것 (접근제한자).
은닉을 하는 이유는 외부 사용으로부터 객체 손상되지 않게 하기 위해서 이다. 보통 필드는 캡슐화한다.
상속 : 새로운 클래스가 기존 클래스의 필드, 생성자, 메서드 이용할 수 있게 하는 기능 => 상속의 장점 코드의 재사용성을 높여주고 유지보수 시간 최소화 시켜준다. 프로젝트 때 사용한 상속의 예를 들며 대답하기 클린코드 형태가 되었다, 중복된 코드가 사라져서 코드가 클린코드가 되었다, 유지보수 시간이 줄어들었다,
다형성 : 사용방법은 같지만 결과가 다양하게 나온다. - 즉 상위클래스에 있는 메서드를 오버라이딩 할 때, 하위클래스에서는 메서드의 기능이 달라진다. -> 업/다운 캐스팅 연결해서 대답. ( 형변환을 해서 하위 클래스를 상위클래스로 변경을 하면서 다형성이라는 개념을 인식했다 )
추상화 : 공통의 속성이나 기능을 묶어 추상클래스로부터 만들어 사용
오버로딩과 오버라이딩 차이점 :
→ 오버로딩 : 함수의 재정의 (함수의 이름만 동일하고 매개변수가 달라야 한다. (매개변수의 수, 배치순서)
특정 클래스 내에서 이름이 같은 메서드를 여러 개 중복해서 정의한 것.
→ 오버라이딩 : 상위 클래스의 함수 재정의 ( 함수이름, 매개변수, 반환형 그대로 가져와서 재정의 해야 함)
접근제한자
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 일시정지 메서드) - 프로젝트와 연결해서 설명