오늘은
오늘은 학원에서 연달아 테스트를 두개를 보았습니다
그래서 수업을 거의 하지 못했는데요
성적이 꽤나 잘 나와서 다행이라고 생각합니다
Java에 대해서는 학원 수업으로 온전히 하고있고
이후에 혼자 JavaScript를 공부하고 틈틈이 코딩 테스트를 풀고있기 때문에
Java 공부가 조금 부족하지 않았나 걱정 했지만
나름 잘 따라가고 있었던 듯 합니다
하지만 따라가는것에 만족을 하면 안되겠지요...
더욱 열심히 해보도록 하겠습니다
Java 강의
package test;
import java.util.Arrays;
import java.util.Scanner;
public class TestController {
public void test1() {
Scanner sc = new Scanner(System.in);
String[] personArr = new String[5];
for(int i = 0; i < personArr.length; i++) {
System.out.print((i+1) + "번째 주민번호 입력 : ");
String personId = sc.nextLine();
if((personId.length() == 14)) {
char gender = personId.charAt(7);
char hyphen = personId.charAt(6);
if(gender == '1' || gender == '2' || gender == '3' || gender == '4' && hyphen == '-') {
personArr[i] = personId.substring(0, 8) + "******";
} else {
System.out.println("잘못된 주민번호 형식입니다. 다시입력하세요.");
i--;
}
} else {
System.out.println("잘못된 주민번호 형식입니다. 다시입력하세요.");
i--;
}
}
System.out.println("--- 주민번호 정보 등록 완료 ---");
System.out.println(Arrays.toString(personArr));
}
}
package test;
public class TestRun {
public static void main(String[] args) {
TestController tc = new TestController();
tc.test1();
}
}
Console
1번째 주민번호 입력 : 910310 - 2012321
잘못된 주민번호 형식입니다. 다시입력하세요.
1번째 주민번호 입력 : 910310-2012321
2번째 주민번호 입력 : 940221-1023922
3번째 주민번호 입력 : 9510231230012
잘못된 주민번호 형식입니다. 다시입력하세요.
3번째 주민번호 입력 : 951023-1230012
4번째 주민번호 입력 : 981220-2031202
5번째 주민번호 입력 : 032102-4021230
--- 주민번호 정보 등록 완료 ---
[910310-2******, 940221-1******, 951023-1******, 981220-2******, 032102-4******]
String 메서드를 이용한 주민번호 등록 프로그램입니다
중간중간 오류를 수정해서 프로그램이 정상적으로 작동할 수 있도록 코드를 수정해주고
예외를 처리해야하는 테스트였습니다
package kr.or.iei.run;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
private static ServerSocket serverSocket;
public static void main(String[] args) {
System.out.println("====================================================");
System.out.println("서버를 종료하려면 q 또는 Q를 입력하고 Enter를 누르세요.");
System.out.println("====================================================");
//TCP 서버 시작
startServer();
Scanner scanner = new Scanner(System.in);
while(true) {
String key = scanner.nextLine();
if(key.toLowerCase().equals("q")) {
break;
}
}
scanner.close();
stopServer();
}
public static void startServer() {
//작업 스레드 정의
Thread thread = new Thread() {
@Override
public void run() {
//ServerSocket 생성 및 Port 바인딩
try {
serverSocket = new ServerSocket(7777);
System.out.println("[서버] 시작됨");
while(true) {
System.out.println("\n[서버] 연결 요청을 기다림\n");
Socket socket = serverSocket.accept();
InetSocketAddress isa = (InetSocketAddress)socket.getRemoteSocketAddress();
String clientIp = isa.getHostString();
System.out.println("[서버] " + clientIp + "의 연결 요청을 수락함");
//데이터 받기
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
String message = dis.readUTF();
//System.out.println("[서버] 데이터를 받음: " + message);
//데이터 보내기
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(message);
dos.flush();
System.out.println("[서버] 받은 데이터를 다시 보냄: " + message);
socket.close();
System.out.println("[서버] " + clientIp + "의 연결을 끊음");
}
} catch (IOException e) {
System.out.println("[서버] " + e.toString());
}
}
};
thread.start();
}
public static void stopServer() {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package kr.or.iei.run;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
try {
Socket socket = new Socket("127.0.0.1", 7777);
System.out.println("[클라이언트] 연결 성공");
//데이터 보내기
String sendMessage = "오늘도 좋은 하루 되세요!";
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(sendMessage);
dos.flush();
System.out.println("[클라이언트] 데이터를 보냄: " + sendMessage);
//데이터 받기
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
String receiveMessage = dis.readUTF();
System.out.println("[클라이언트] 데이터를 받음: " + receiveMessage);
socket.close();
System.out.println("[클라이언트] 연결 끊음");
} catch (UnknownHostException e) {
System.out.println(e.toString());
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
====================================================
서버를 종료하려면 q 또는 Q를 입력하고 Enter를 누르세요====================================================
[서버] 시작됨
[서버] 연결 요청을 기다림
[서버] 127.0.0.1의 연결 요청을 수락함
[서버] 받은 데이터를 다시 보냄: 오늘도 좋은 하루 되세요!
[서버] 127.0.0.1의 연결을 끊음[서버] 연결 요청을 기다림
q
[서버] java.net.SocketException: Socket closed
[클라이언트] 연결 성공
[클라이언트] 데이터를 보냄: 오늘도 좋은 하루 되세요!
[클라이언트] 데이터를 받음: 오늘도 좋은 하루 되세요!
[클라이언트] 연결 끊음
TCP 서버를 이용한 데이터를 주고받는 프로그램입니다
마찬가지로 오류나는 부분을 찾아서 고치고 예외를 처리해주어야 하는 테스트였습니다
JavaScript 공부
<화살표함수, this키워드>
this키워드를 사용하면 일반함수를 사용했을 때와 화살표 함수를 사용했을 때가 다르게 동작한다
const person = {
firstName : 'viggo',
lastName : 'Mortensen', // 사람이라는 상수와 특성 두개 = 객체
fullName : function( ) { // 풀네임 메서드
return `${this.firstName} ${this.lastName}`
}
=> 이름 출력
=> this키워드가 함수 왼쪽에 있는 객체를 가리킨다 = 사람이라는 객체를 가리킨다
const person = {
firstName : 'viggo',
lastName : 'Mortensen', // 사람이라는 상수와 특성 두개 = 객체
fullName : function( ) => { // 화살표 함수로 변경
return `${this.firstName} ${this.lastName}`
}
=> 이름 전체 호출
=> 정의하지 않았다고 나온다
=> this키워드는 함수가 만든 범위를 가리키게 된다 = 윈도우 객체를 가리킨다
<디폴트 매개변수>
함수를 쓸 때 매개변수를 사용하는것은 선택
= 매개변수가 있으면 그 값을 사용, 매개변수가 없으면 디폴트 매개변수를 받는다
function rollDie(numSides) {
if (numSides === undefined) { // 매개변수를 정의하지 않음
numSides = 6 // numSides를 6이라고 해줌
}
return Math.floor(Math.random( ) * numSides) + 1
} // 주사위를 무작위로 굴린것과 같은 결과가 나온다
// rollDie() 함수에 rollDie(20)의 값을 넣어도 작동이 잘 된다
=> 옛날 방식, 매개변수가 여러 개 있으면 곤란해진다
function multiply(a, b = 1) { // a = 디폴트값X, 어떤 값을 넣든지 첫 번째 인수가 된다
return a * b; // b = 디폴트값O, b를 없애면 디폴트 값인 1이 나온다
}
multiply(4); // 4
multiply(4, 5); // 20
function greet(msg = "Hey there", person) { // msg 디폴드 값 사용
console.log(`${msg}, ${person}!`)
}
greet("Hello", "Joaquin")
=> Hello, Joaquin! 출력
greet("Joaquin")
=> Joaquin, undefined! 출력
= 디폴드 값을 사용하는 경우 매개변수의 순서가 중요하다
=> 디폴드 값을 가지는 매개변수는 2번째 이상의 순서에 오는게 좋다
function greet(person, msg = "Hey there") {
console.log(`${msg}, ${person}!`)
}
<SPREAD(전개 구문)>
배열과 같이 반복 가능한 객체를 전개 구문을 사용하여 확장한다
함수로 호출할 경우엔 인수로, 배열 리터럴에서는 요소로 확장할 수 있다
객체 리터럴의 경우 객체 표현식은 키-값 쌍으로 확장할 수 있다
전개 구문의 역할 = 어떤 것을 가져와서 펼치는 역할
Math.max(12,123,41,42,5,1,23,4,52,6,116,321,44,23,31)
=> 321
const nums = [12,123,41,42,5,1,23,4,52,6,116,321,44,23,31]
Math.max(nums)
=> NaN // 숫자 전체가 있는 배열이 통과되기 때문에 어떻게 출력해야 할지 모름
//이런 경우 전개 사용
//= 점 세개가 필요
//= ...nums
Math.max(...nums)
=> 321
console.log(nums)
=> [12,123,41,42,5,1,23,4,52,6,116,321,44,23,31]
console.log(...nums)
=> 12 123 41 42 5 1 23 4 52 6 116 321 44 23 31 // 숫자 사이에 공백이 생김
const cats = ['Blue', 'Scout', 'Rocket'];
const dogs = ['Rusty', 'Wyatt'];
const allPets = [...cats, ...dogs];
=> ['Blue', 'Scout', 'Rocket', 'Rusty', 'Wyatt']
=> 객체를 복사할 때 전개를 사용해서 펼친다 -> 라이브러리나 React 도구로 작업할 때 유용하다
= 정보의 소스를 펼쳐서 다른 용도로 만드는 것
<나머지 매개변수>
함수를 만들 때 => 인수 객체라는 값이 함수로 전달
인수 객체 = 배열과 비슷해 보임 => 유사 배열 객체라고도 한다
= 함수로 전달된 인수를 모두 가지고 있다
하지만 배열 메서드는 사용할 수 없다 = 배열과 비슷하지만 배열이 아니기때문
나머지 연산자 = 점 세 개로 만들고 매개변수 목록에 들어간다
남아 있는 인수를 모두 모으고 배열로 나타낸다
인수 = 화살표 함수에서 사용할 수 없다 => 나머지 매개변수가 필요한 부분
function sum(...nums) {
console.log(nums)
}
// 처음에 호출했던 매개변수를 가질 수 있다는 의미
function raceResults(gold, silver, ...everyoneElse){ // 나머지 참가자
console.log(`GOLD MEDAL GOES TO: ${gold}`)
console.log(`SILVER MEDAL GOES TO: ${silver}`)
console.log(`AND THANKS TO EVERYONE ELSE: ${everyoneElse}`)
}
=> raceResults('Tammy', 'Todd', 'Tina', 'Trevor', 'Travis')
=> GOLD MEDAL GOES TO: Tammy
SILVER MEDAL GOES TO: Todd
AND THANKS TO EVERYONE ELSE: Tina, Trevor, Travis // 나머지
Coding Test Practice
Description
정수 배열 arr와 2개의 구간이 담긴 배열 intervals가 주어집니다. intervals는 항상 [[a1, b1], [a2, b2]]의 꼴로 주어지며 각 구간은 닫힌 구간입니다. 닫힌 구간은 양 끝값과 그 사이의 값을 모두 포함하는 구간을 의미합니다. 이때 배열 arr의 첫 번째 구간에 해당하는 배열과 두 번째 구간에 해당하는 배열을 앞뒤로 붙여 새로운 배열을 만들어 return 하는 solution 함수를 완성해 주세요.
function solution(arr, intervals) {
var answer = [];
var first = [];
var second = [];
first = arr.slice(intervals[0][0],intervals[0][1]+1);
second = arr.slice(intervals[1][0],intervals[1][1]+1);
for(var i = 0; i < first.length; i++){
answer.push(first[i]);
}
for(var i = 0; i < second.length; i++){
answer.push(second[i]);
}
return answer;
}
Description
머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.
function solution(n) {
// 피자 = 6조각
// 피자판 % 사람 == 0
for(var pizza = 1; pizza <= n; pizza++){
if((pizza * 6) % n == 0){
return pizza;
}
}
}
Description
문자열 binomial이 매개변수로 주어집니다. binomial은 "a op b" 형태의 이항식이고 a와 b는 음이 아닌 정수, op는 '+', '-', '*' 중 하나입니다. 주어진 식을 계산한 정수를 return 하는 solution 함수를 작성해 주세요.
function solution(binomial) {
var answer = " "
binomial = binomial.split(' ');
var a = Number(binomial[0])
var b = Number(binomial[2])
if(binomial[1] == "+"){
return answer = a + b;
}
if(binomial[1] == "-"){
return answer = a - b;
}
if(binomial[1] == "*"){
return answer = a * b;
}
}
Description
정수 배열 numLog가 주어집니다. 처음에 numLog[0]에서 부터 시작해 "w", "a", "s", "d"로 이루어진 문자열을 입력으로 받아 순서대로 다음과 같은 조작을 했다고 합시다.
"w" : 수에 1을 더한다.
"s" : 수에 1을 뺀다.
"d" : 수에 10을 더한다.
"a" : 수에 10을 뺀다.
그리고 매번 조작을 할 때마다 결괏값을 기록한 정수 배열이 numLog입니다. 즉, numLog[i]는 numLog[0]로부터 총 i번의 조작을 가한 결과가 저장되어 있습니다. 주어진 정수 배열 numLog에 대해 조작을 위해 입력받은 문자열을 return 하는 solution 함수를 완성해 주세요.
function solution(numLog) {
var answer = '';
for(var i = 0; i < numLog.length-1; i++){
if(numLog[i+1] - numLog[i] == 1){
answer += "w";
}
if(numLog[i+1] - numLog[i] == -1){
answer += "s";
}
if(numLog[i+1] - numLog[i] == 10){
answer += "d";
}
if(numLog[i+1] - numLog[i] == -10){
answer += "a";
}
}
return answer;
}
Description
1부터 6까지 숫자가 적힌 주사위가 세 개 있습니다. 세 주사위를 굴렸을 때 나온 숫자를 각각 a, b, c라고 했을 때 얻는 점수는 다음과 같습니다.
세 숫자가 모두 다르다면 a + b + c 점을 얻습니다.
세 숫자 중 어느 두 숫자는 같고 나머지 다른 숫자는 다르다면 (a + b + c) × (a2 + b2 + c2 )점을 얻습니다.
세 숫자가 모두 같다면 (a + b + c) × (a2 + b2 + c2 ) × (a3 + b3 + c3 )점을 얻습니다.
세 정수 a, b, c가 매개변수로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
function solution(a, b, c) {
var answer = 0;
var sum1 = (a + b + c);
var sum2 = (a*a + b*b + c*c);
var sum3 = (a*a*a + b*b*b + c*c*c
if(a != b && a != c && b != c){
return sum1;
}
if(a == b && a == c && b == c){
return sum1 * sum2 * sum3;
}
if(a == b || a == c || b == c){
return sum1 * sum2;
}
}
2023. 10. 05 (목)
프로그래머 도전기 39일차 (1) | 2023.10.07 |
---|---|
프로그래머 도전기 38일차 (2) | 2023.10.06 |
프로그래머 도전기 36일차 (1) | 2023.10.04 |
프로그래머 도전기 35일차 (2) | 2023.10.03 |
프로그래머 도전기 34일차 (0) | 2023.10.01 |