class Time{
private int hour; //0~23 사이의 값을 가져야 함.
private int minute;
private int second;
public void setHour(int hour){
if(isValidhour(hour)) return;
this.hour = hour;
}
//매개 변수로 넘겨진 hour가 유효한지 확인해서 알려주는 메서드
private boolean isValidhour(int hour){
return hour <0 || hour >23;
}
public int getHour() { return hour; };
}
public class TimeTest {
public static void main(String[] args) {
Time t = new Time();
// t.hour = -100;
t.setHour(21); //hour의 값을 21로 변경
System.out.println(t.getHour());
t.setHour(100);
System.out.println(t.getHour());
}
}
접근제어자의 범위는 최소화 시키는 것이 좋다
다형성(polymorphism)
여러가지 형태를 가질 수 있는 능력
조상 타입 참조 변수로 자손 타입 객체를 다루는 것
타입 불일치해도 괜찮다
객체와 참조변수의 타입이 일치할 때와 일치하지 않을 때의 차이
자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음
참조변수의 타입은 인스턴스의 타입과 일치하는 것이 보통이지만 일치 하지 않을 수도 있음
참조변수가 조상타입일 때와 자손 타입일 때의 차이
참조변수로 사용할 수 있는 멤버의 갯수가 달라짐
자손타입의 참조변수로 조상 타입의 객체를 가리킬 수 없음
참조변수의 형변환
사용할 수 있는 멤버의 갯수를 조절하는 것
조상 자손 관계의 참조변수는 서로 형변환 가능
public class Ex7_7 {
public static void main(String[] args) {
Car car = null;
FireEngine fe = new FireEngine();
// FireEngine fe2 = null; //car = (Car)fe; 에서 형변환이 생략됨
FireEngine fe2 = (FireEngine)car; // 조상 -> 자손으로 형변환
Car car2 = (Car)fe2; // 자손 -> 조상으로 형변환
// car2.drive(); //NullPointerException 발생.
// fe.water();
// fe2 = (FireEngine) fe; //자손타입 <- 조상타입, 형변환 생략 불가
// fe2.water();
}
}
class Car{
String color;
int door;
void drive() {
System.out.println("drive, Brrrr~~");
}
void stop() {
System.out.println("stop!!");
}
}
class FireEngine extends Car {
FireEngine() {
}
void water() {
System.out.println("water!!!");
}
}
class MyPoint{
int x;
int y;
}
//class Circle extends MyPoint { //상속
// int r;
//}
class Circle {
MyPoint p = new MyPoint();
int r;
}
public class InheritanceTest {
public static void main(String[] args) {
Circle c = new Circle();
c.p.x =1;
c.p.y =2;
c.r = 3;
System.out.println("c.p.x="+c.p.x);
System.out.println("c.p.y="+c.p.y);
System.out.println("c.r="+c.r);
}
}
단일 상속(Single Inheritance)
Java는 단일 상속만을 허용한다.
조상은 하나만!
비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
Object클래스 - 모든 클래스의 조상
부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다.
모든 클래스는 Object에 정의된 11개의 메서드를 상속받는다 (toString(), equals(), hashCode(),...)
public class InheritanceTest {
public static void main(String[] args) {
Circle c = new Circle();
System.out.println(c.toString()); //Circle@340f438e
Circle c2 = new Circle();
System.out.println(c2.toString()); //Circle@30c7da1e
}
}
toString()을 안써도 똑같이 출력된다.
println()의 기능
오버라이딩(overriding)
상속받은 조상의 메서드를 자신에 맞게 변경하는 것
선언부는 변경 불가, 내용만 변경가능
오버라이딩
class Point {
int x;
int y;
String getLocation(){
return "x: "+ x + ", y:" +y;
}
}
class MyPoint3 extends Point {
int z;
//조상의 getLocation()을 오버라이딩
String getLocation(){
return "x: "+ x + ", y:" +y+" ,z:"+z;
}
}
public class OverrideTest {
public static void main(String[] args) {
MyPoint3 p = new MyPoint3();
p.x = 3;
p.y =5;
p.z =7;
System.out.println(p.getLocation());
}
}
public class Member {
String name;
String id;
String password;
int age;
public static void main(String[] args) {
Member member = new Member();
member.name = "최하얀";
member.age =23;
System.out.println("이름: "+member.name);
System.out.println("나이: "+member.age);
}
}
임의의 양의 정수 n에 대해, n이 어떤 양의 정수 x의 제곱인지 아닌지 판단하려 합니다.n이 양의 정수 x의 제곱이라면 x+1의 제곱을 리턴하고, n이 양의 정수 x의 제곱이 아니라면 -1을 리턴하는 함수를 완성하세요.
제한 사항
n은 1이상, 50000000000000 이하인 양의 정수입니다.
문제 풀이
if else문을 사용하면 될 것 같습니다...?
1. x*x == n 이면 (x+1)*(x+1) 을 리턴하고 else -1을 리턴한다.
2. sqrt(n) = x
public class Squareroot {
public long solution(long n) {
long answer = 0;
long x = 0;
x = (long) Math.sqrt(n);
if(x*x ==n){
answer = (x+1)*(x+1);
} else {
answer = -1;
}
return answer;
}
public static void main(String[] args) {
Squareroot method = new Squareroot();
System.out.println(method.solution(121));
}
}
public class Ex5_1_tmp {
public static void main(String[] args) {
// int[] score; 1. 배열 score를 선언(참조변수)
// score = new int[5]; 2. 배열의 생성(int저장공간 x 5)
int [] score = new int[5]; // 배열의 선언과 생성을 동시에
score[3] =100;
}
배열의 길이
"배열은 한번 생성하면 그 길이를 바꿀 수 없다."
배열의 초기화
배열의 각 요소에 처음으로 값을 저장하는 것
int[] score = { 1, 2, 3,4,5};
배열의 출력
char[] ChArr
캐릭터 배여일 때만 출력 가능
// 배열의 요소를 순서대로 하나씩 출력
for( int i=0; i<Arr.length; i++){
System.out.println(Arr[i]);}
//배열의 모든 요소를 출력
System.out.println(Arrays.toString(Arr));
배열의 활용
총점과 평균 구하기
public class Ex5_2 {
public static void main(String[] args) {
int sum=0;
float average =-0f;
int[] score = {100,88,100,100,90};
for (int i=0; i <score.length; i++){
sum += score[i];
}
average = sum /score.length; //계산결과를 Float으로 얻기
System.out.println("총점 : " + sum);
System.out.println("평균 : " + average);
}
}
최대값과 최소값
public class Ex5_3 {
public static void main(String[] args) {
int[] score = {79, 88, 91, 33, 100, 55,95};
int max = score[0];
int min = score[0];
for(int i=1; i <score.length; i++) {
if(score[i]> max){
max = score[i];
} else if(score[i]<min){
min = score[i];
}
}
System.out.println("최대값 :"+max);
System.out.println("최소값 :"+min);
}
}
섞기(Shuffle)
import java.util.Arrays;
public class Ex5_4 {
public static void main(String[] args) {
int[] numArr = {0,1,2,3,4,5,6,7,8,9};
System.out.println(Arrays.toString(numArr));
for (int i =0; i<100; i++){
int n = (int)(Math.random()*10);
int tmp = numArr[0];
numArr[0] = numArr[n];
numArr[n] =tmp;
}
System.out.println(Arrays.toString(numArr));
}
}
로또 번호
import java.util.Arrays;
public class Ex5_5 {
public static void main(String[] args) {
int[] ball = new int[45]; //45개 정수값을 저장하기
//배열의 각 요소에 1~45값을 저장
for(int i=0; i<ball.length; i++){
ball[i]=i+1; // ball[0]에 1이 저장된다.인덱스는 0부터 시작하니까
}
System.out.println(Arrays.toString(ball));
int tmp =0; // 두 값을 바꾸는데 사용할 임시변수
int j =0; // 임의의 값을 얻어서 저장할 변수
// 배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바꿔서 값을 저장
// 0번째부터 5번째 요소까지 모두 6개만 바꾼다.
for (int i=0; i<6; i++){
j=(int)(Math.random()*45); //0~44범위 임의의 수
tmp =ball[i];
ball[i] = ball[j];
ball[j] = tmp;
System.out.println(Arrays.toString(ball));
}
//배열 ball의 앞에서부터 6개의 요소를 출력한다.
for(int i=0; i<6; i++){
System.out.printf("ball[%d]=%d%n", i, ball[i]);
}
}
}
이번주 월요일에 정식으로 부트캠프를 시작했고 벌써 첫번째 주의 마지막날이 되었습니다. 월요일에는 아무것도 모르는 백지상태에 가까웠다면, 이제는 JWT를 이용해서 회원가입, 로그인, 로그아웃을 구현할줄 알게 되었고, Github을 이용해서 팀 프로젝트를 완성했습니다. Rest API 형식을 따라서 API 설계도 해보고 MongoDB를 이용해서 DB 설계도 경험했습니다. flask의 Blueprint를 사용해서 효율적으로 분업을 했고 후에 merge할 때 충돌이 한번도 발생하지 않았습니다.
뛰어난 조원분들과 함께해서 제가 기여한 부분이 메인은 아니지만 나름 맡은 역할을 다 했습니다.
제가 기획한 프로젝트가 채택되어서 기획쪽도 재미가 있다고 생각했습니다.
늘 저는 아이디어는 많습니다.
첫 코드리뷰를 진행하다
오늘은 함께 첫 프로젝트를 진행한 조원들과 함께 코드리뷰를 진행했습니다.
- 백에서 할수 있는 것은 최대한 백에서 처리하기
- API 설계를 아는 것이 중요하다
- 이번 프로젝트에는 Rest API 를 사용했음
- DB 설계에 맞춰 API 설계하기
저는 이번주에 시작한 완전 초짜지만 먼저 시작한 선배님들의 조언과 여러 피드백을 들으면서 월요일보다 성장한 것 같습니다. 함께한 조원분들이 성격도 좋고 개발도 잘해서 다행이었던 프로젝트였습니다.
다음 주에는...
이제는 자바스크립트를 뒤로 하고 자바에 집중하는 한주가 될 예정입니다. 오늘은 남궁성 자바의 정석 ch 5까지 들었습니다. 프로그래머스 알고리즘 문제를 지난 이틀간 풀었는데 아무래도 자바 기초가 부족하다 보니 간단한 문제도 방법을 몰라서 푸는 경우가 많았습니다. 문제 푸는 로직은 어느정도 이해는 갑니다. 더 많은 메소드를 알게 되면 알고리즘 문제 풀이가 좀 더 수월할 것 같습니다.
시그마로 푸는 문제가 하나 있었는데 언제 이걸 봤었지 했는데 고등학생인가 대학생때 통계학에서 배운 기억이 났습니다. 알고리즘 주차에 걷기반을 선택해서 28 문제를 푸는 것이 학습 목표인데 좀더 욕심을 내서 달리기 반의 문제 10개까지 추가를 해서 풀어보도록 하겠습니다.
2. case문의 값은 정수, 상수(문자포함), 문자열만 가능하며, 중복되지 않아야 한다.
임의의 정수 만들기
Math.random() - 0.0과 1.0사이의 임의의 double값을 반환
0.0 <= Math.random() < 1.0
1과 3사이의 정수 구하기
1. 각 변에 3을 곱한다.
2. 각 변을 Int형으로 변환한다.
3. 각 변에 1을 더한다.
System.out.println((int)(Math.random()*11)-5);//-5와 5의 사이
for문
조건을 만족하는 동안 블럭{}을 반복 - 반복 횟수를 알 때 적합
변수의 범위(scope)는 좁을수록 좋다; 선언위치부터 선언된 블럭의 끝까지
//조건식을 생력하면, true로 간주되엇 무한반복문이 된다.
for(;;){
System.out.println("i="+1);
}
중첩 for 문
직사각형 별찍기
public class Ex4_15 {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
for (int j = 1; j <= 10; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
별 늘리기
public class Ex4_15 {
public static void main(String[] args) {
for(int i=1; i<=5; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
while문
조건을 만족시키는 동안 블럭{}을 반복 - 반복 횟수 모를 때
while 조건식 {
//조건식의 연산결과가 참(true)인 동안, 반복될 문장들을 적는다.
}
for문과 100% 상호 대체 가능
for 문
public class Ex4_14 {
public static void main(String[] args) {
int num =12345, sum =0;
//10으로 나머지 연산을 하면 마지막 자리를 얻는다.
// System.out.println(12345%10);
//num = 12345, 1234, 123,12, 1
for(num=12345; num>0; num=num/10){
System.out.println(num);
}
System.out.println("각 자리수의 합:" +sum);
}
}
while문으로 바꾸기
public class Ex4_14 {
public static void main(String[] args) {
int num =12345, sum =0;
//10으로 나머지 연산을 하면 마지막 자리를 얻는다.
// System.out.println(12345%10);
//num = 12345, 1234, 123,12, 1
while(num>0){
sum += num%10;
System.out.println("sum"+sum+",num%10="+num%10);
num =num/10;
}
System.out.println("각 자리수의 합:" +sum);
}
}
do-while문
블럭{}을 최소한 한 번 이상 반복 - 사용자 입력받을 때 유용
break문
자신이 포함된 하나의 반복문을 벗어난다.
while문
public class Ex_16 {
public static void main(String[] args) {
int sum =0;
int i =0;
while(true){//무한 반복문 for(;true;) {}
if(sum>100)
break; //자신이 속한 하나의 반복문을 벗어난다.
++i;
sum += i;
} // end of while
System.out.println("i=" +i);
System.out.println("sum=" + sum);
}
}
for문
public class Ex_16 {
public static void main(String[] args) {
int sum =0;
int i =0;
for(;;){//무한 반복문 for(;true;) {}
if(sum>100)
break; //자신이 속한 하나의 반복문을 벗어난다.
++i;
sum += i;
} // end of while
System.out.println("i=" +i);
System.out.println("sum=" + sum);
}
}
continue문
자신이 포함된 반복문의 끝으로 이동 - 다음 반복으로 넘아감
전체 반복 중에서 특정 조건시 반복을 건너뛸 때 유용
break문과 달리 반복문을 벗어나지 않는다.
public class Ex4_17 {
public static void main(String[] args) {
for(int i=0; i<= 10; i++){
if(i%2==0)
continue;
System.out.println(i);
}
}
}
예시
import java.util.Scanner;
public class Ex4_18 {
public static void main(String[] args) {
int menu =0;
int num =0;
Scanner scanner = new Scanner(System.in);
while (true){ // 무한 반복문
System.out.println("(1) square");
System.out.println("(2) square root");
System.out.println("(3) log");
System.out.println("원하는 메뉴(1~3)을 선택하세요. (종료:0>");
String tmp = scanner.nextLine(); //화면에서 입력받은 내용을 tmp에 저장
menu = Integer.parseInt(tmp); //입력받은 문자열(tmp)을 숫자로 변환
if(menu==0) {
System.out.println("프로그램을 종료합니다");
break;
} else if (!(1<=menu && menu<=3)) {
System.out.println("메뉴를 잘못 선택하셨습니다. (종료는 0)");
continue;
}
System.out.println("선택하신 메뉴는" + menu + "번입니다.");
} //main의 끝
}
}
짝수인 경우, 중간 문자 2개가 answer가 된다. int 이기 때문에 자동으로 소수점 이하 값은 없애버림
예시. String s = cute; int length =4; 4%2 ==0; 짝수
.charAt() 메소드를 이용해서 x 번째 문자의 값을 구한다
짝수인 경우 가운데 두글자
홀수인 경우 가운데 한글자
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
String answer = "";
int length = s.length();
if(length%2==0){
answer+= s.charAt(length/2-1);
answer+= s.charAt(length/2);
}else{
answer+= s.charAt(length/2);
}
System.out.println(answer);
}
}
제출하고 통과는 했으나....
한줄 짜리 코드로도 가능했던 것이었던 것이었습니다.
substring()
.substring 메소드를 이용하는 방법
.substring(start letter, end letter)
시작하는 글자, 끝나는 글자 순번을 넣어주면 됩니다.
.substring(start letter)
시작하는 글자 부터 끝까지 출력합니다.
4. 정수의 합 구하기
a와 b 사이의 숫자를 모두 더한 값을 구하는 문제입니다.
a와 b 중 큰 값을 long max, 작은 값을 long min 으로 정의한다.
for문의 초기값을 min, 최대값을 max, 증가연산자 일 때 합을 구한다
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
long answer =0;
long min = Math.min(a,b);
long max = Math.max(a,b);
for (long x=min; x<=max;x++){
answer += x;
}
System.out.print(answer);
}
}
이렇게 열심히 했는데....
sumAtoB라는 함수가 있었습니다..
sumAtoB() 는 A와 B 사이의 값을 구합니다.
sumAtoB()
5. 문자열을 정수로 전환하기
public class Ex2_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int answer = 0;
String s = scanner.nextLine();
answer = Integer.parseInt(s);
System.out.println(answer);
}
}
되게 간단하다고 생각을 했었습니다만....
마! 이게 알고리즘이다
6. 없는 숫자 더하기
말그대로 없는 숫자를 더해야 합니다.
function solution(numbers) {
let answer = 0;
for(let i = 0; i <= 9; i++) {
if(!numbers.includes(i)) answer += i;
}
return answer;
}
드디어 한 주가 끝났습니다. 일주일동안 핵심 쏙쏙 Git 강의를 들었고 혼자 공부하는 자바 챕터 5까지 진도를 나갔습니다. 이번주는 Pre-Onboarding 기간으로 주특기 언어를 학습하는 시간이었고 다음주부터 정식으로 시작합니다. 부족한 공부를 위해서 어떻게 해야하나 백준이랑 프로그래머스라는 게 있다는 데 조사를 해봐야겠습니다. 일단 어디서 시작해야할지 알아보는 중이에요. 아예 새로운 분야에 입문하려고 하니까 공부할 게 태산이네요.
int year = now.get(Calendar.YEAR); //연
int month = now.get(Calendar.MONTH) +1; //월(1~12)
int day = now.get(Calendar.DAY_OF_MONTH); //일
int week = now.get(Calendar.DAY_OF_WEEK); //요일(1~7)
int hour = now.get(Calendar.HOUR); //시간
int minute = now.get(Calendar.MINUTE); //분
int second = now.get(Calendar.SECOND); //초
열거 타입과 열거 상수
Week.java (열거 타입 선언)
public enum Week {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}
Main.java (열거 타입 사용하기)
import java.util.Calendar;
public class Main {
public static void main(String[] args) {
Week today = null;
Calendar cal = Calendar.getInstance();
int week = cal.get(Calendar.DAY_OF_WEEK);
switch (week) {
case 1:
today = Week.SUNDAY; break;
case 2:
today = Week.MONDAY; break;
case 3:
today = Week.TUESDAY; break;
case 4:
today = Week.WEDNESDAY; break;
case 5:
today = Week.THURSDAY; break;
case 6:
today = Week.FRIDAY; break;
case 7:
today = Week.SATURDAY; break;
}
System.out.println("오늘 요일: " + today);
if(today == Week.SUNDAY) {
System.out.println("일요일에는 축구를 합니다.");
} else {
System.out.println("열심히 자바 공부합니다.");
}
}
}
❗열거 타입을 사용하려면 public enum 열거 타입 선언한 먼저 해야함
확인문제 복습 손코딩으로 하기
손코딩으로 해야 는다는 글을 어디서 본 적이 있어서 복습은 노트에 손코딩하면서 하기로 결심했습니다. 확실히 답지도 안보고 문제만 보면서 펜으로 노트에 직접 쓰니까 더 머릿속에 잘 들어오는 듯 합니다. 그래도 한 번 푼 문제라고 풀리는 문제가 안풀리는 문제보다는 많습니다.
근데 생각보다 저는 더 악필이네요🤓
while문에 break; 잊지 않기
타입 선언 잊지 않기
변수 선언한 {}를 벗어나놓고 왜 안되지 하지 않기
이유 알고 쓰기
{} 빼먹지 않기; 실행 순서 알기
문제를 꼼꼼히 읽읍시다
String 변수는 .equals() 메소드를 사용
chapter 2 변수
Chapter 02-1
1. o,x 문제
변수는 하나의 값에만 저장할 수 있음
변수 선언 시에 사용한 타입의 값만 저장할 수 있음
변수는 초기 값이 저장되지 않은 상태에서 읽을 수 없음
2. 변수 이름으로 사용할 수 있는 것 o,x 문제
$value는 사용할 수 있음
첫번째 글자는 문자이거나 '$', '_' 만 가능함
Chapter 02-2
2. o,x 문제
char var = 'AB'; //char 타입이 아니라 String 타입임
long var = 50000000000; //long은 int 타입의 범위를 벗어 날 시 숫자 뒤에 L 을 붙어야 함
String var = "나의 직업은 "개발자" 입니다."; //"를 썼으면 안에는 '를 써야함
Sololearn에서 제공하는 Java 언어 학습은 총 60개 레슨으로 이루어져 있습니다. 현재는 아직 40번째 레슨에 머물러 있는 상태에요. 뒤로 갈수록 어려워져서 그렇습니다. 부트캠프 핑계로 Sololearn을 놓고 있지만 이번주 일요일까지는 Sololearn의 Java를 끝내 보도록 하겠습니다. 어차피 저랑은 당분간 친해지려고 노력해야하는 언어입니다. 이 포스팅에서는 공부하다가 헷갈리거나 다시 복습하고 싶은 부분을 캡쳐해서 정리해보려고 합니다.
.toCharArray() : String 타입을 CharArray로 바꾼다. 문자열을 문자별로 다 따로 저장
ex) "Santa" -> "S", "a", "n", "t", "a"
arr.length에 -1을 하는 이유:
.length에 -1을 하지 않는 경우: core dump error가 발생
arr[10]에서 배열의 첫 주소는 0부터 시작하지만!!
즉, 배열의 주소는 arr+0, arr+1, ..., arr+9까지이고, 이는 arr[0], arr[1], ..., arr[9]로 표현됨
즉, arr[10]부터는 존재하지 않고 arr[10]에 관한 코드가 작성되면 에러가 발생
이중for문에서 j<length(=10)이기 때문에 j가 될 수 있는 가장 마지막 수는 9가 되니 j가 9인 경우, if문 안에 j=9인 상황을 대입하면 arr[9] < arr[10]입니다. 이 때 arr[10]은 코드 어디에도 정의되지 않았기 때문에 찾을 수 없음. 그렇기 때문에 컴퓨터는 arr[10]이 도대체 어디 정의되었는지 알 수 없다고 에러를 발생시킵니다.
그렇기 때문에 for문의 범위를 length-1까지 정해준다.
그러니까 갯수 세는건 우리가 아는 것 처럼 세지만!!! index 번호는 0부터 시작하니까 array 마지막 수를 부르고 싶으면 array.length-1 을 써야한다!
Reverse a String
Object-Orientation
Java는 Object-Oriented Programming(OOP) 객체지향 프로그래밍 스타일을 사용하고 현실과 가깝게 프로그래머들이 생각할 수 있도록 한다
OOP에서는 각 객체가 유니크 아이덴티티를 가진 독립적인 유닛이다. (마치 현실에서 그런것처럼(?))
사과는 객체이다. 머그잔도 그러하다. 각각의 사물은 그만의 아이덴티티를 가진다. 두개의 머그잔이 똑같이 생길 수는 있지만 각각의 독립적인 유니크한 objects이다.
Objects는 그들을 묘사하는 특징이 있다.
차가 빨간색이거나 파란색, 머그잔이 가득 차 있거나 비어있는 것처럼 말이다.
이러한 특징(characteristics)들은 attributes라고 불린다.
attributes는 object의 현 상태를 묘사한다.
차가 움직이거나 전화가 울리는 것처럼 object type에도 behavior 가 적용된다.