StudyServer
web, server, java, spring 등.. 공부한 것을 기록하는 장소 입니다. 공부하면서 정리하였기 때문에 틀린 내용이 있을 수 있습니다. 이야기 해주시면 수정하겠습니다.

Java 생성자, this, super

2018-11-06 00:00:00 +0000

생성자 호출 순서

C가 B를 상속하고 B가 A를 상속하고 있다

public class A {
     public A(){
           System.out.println("A 생성자 호출");
     }
}

public class B extends A{
      public B() {
            System.out.println("B 생성자 호출");
      }
}

public class C extends B{
     public C(){
           System.out.println("C 생성자 호출");
     }
}

결과

A 생성자 호출
B 생성자 호출
C 생성자 호출

this, this(), super, super()

  • this : 현재 클래스를 가르킴. this.멤버변수 사용 시 현재 클래스의 멤버변수를 사용
  • super : 부모 클래스를 가르킴. super.멤버변수 사용 시 부모클래스의 멤버변수를 사용 만약 B클래스가 a 멤버변수가 없다면 C클래스가 super.a 하면 A의 멤버변수 a가 호출됨
public class A {
     protected int a = 1;
     public A(){
           System.out.println("A 생성자 호출");
     }
}
public class B extends A{
     int a = 2;
      public B() {
            System.out.println("B class super.a:"+super.a+"  this.a:"+this.a+" a:"+a);
      }
}

public class C extends B{
     int a = 3;
     public C(){
            System.out.println("C class super.a:"+super.a+"  this.a:"+this.a+" a:"+a);
     }
}

출력결과

A 생성자 호출
B class super.a:1 this.a:2 a:2
C class super.a:2 this.a:3 a:3
  • this() : 자신의 생성자를 불러온다
  • super() : 자신의 부모클래스의 생성자를 불러온다
    • 둘 다 { 다음에 바로 써야한다. 그렇지 않으면 ‘Constructor call must be the first statement in a constructor’ 에러가 난다
    • { 다음에 바로 써야 하기 때문에 this(), super() 동시에 사용하진 못한다
public class A {
     protected int a;
     public A(){
           this(2);
           System.out.println("A() 생성자 호출");
           //this(2);      // error must be first!
           //A(1);               // error
           //this.A(1);    // error
     }
     
     public A(int a){
           System.out.println("A(int a) 생성자 호출");
           this.a = a;
     }
}

출력결과

A(int a) 생성자 호출
A() 생성자 호출
  • 자식 클래스에서 super 호출
    public class B extends A{
       protected int a;
        public B() {
              System.out.println("B()");
        }
        public B(int a){
             super(1);
             System.out.println("B(int a)");
             this.a = a;
        }
    }
    

출력결과

A(int a) 생성자 호출
B(int a)

roomnum

2018-11-05 00:00:00 +0000

Problems

https://www.acmicpc.net/problem/1475

Problems solving

각 플라스틱 숫자 중 가장 많이 포함된 숫자 갯수 만큼 사면된다.
다만 6과 9는 합쳐서 계산해야하므로 ‘숫자 6,9 제외 각각 개수’와 ‘숫자 6,9 개수’ 를 비교한다(6,9개수/2+나머지로 비교)
예를 들어 번호판이 ‘212242699’라면
1: 1개
2: 4개
4: 1개
6, 9 : 3개
2번이 4개로 가장 많으므로 플라스틱 숫자판은 4개를 사면 된다

또 번호판이 6과 9를 합친개수가 많은 ‘34969241’ 이라면
1:1개
2:1개
3:1개
4:2개
5:3개

3/2 + 3%2 = 1 + 1 = 2개로 세트를 2개 사면 된다

Source 구현 순서

  1. 입력값의 자리수를 구한다
  2. 자리수만큼 돌면서 각 자리의 숫자 counting한 것을 배열에 저장한다
  3. 최고로 많이 카운팅된 값과 6, 9를 더한 값/2한 값을 비교한다
    6, 9값 제외한 값 이 제일 크다면 그 값을 쓴다.
    하지만 6,9 포함한 값이 크다면 6,9카운팅/2 + 나머지로 계산할 수 있다
  4. 만약 6과 9를 더한 값이 같거나 크다면 최고로 많이 카운팅 된 값을 수정한다

Source

import java.util.Scanner;

public class RoomNum {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int[] arrIndex = new int[10];
		int value = sc.nextInt();
		int i = 1;					// 자리수가 몇개인지 알아내기 위해서 받은 값을 나누는데 사용
		int count = 1;				// 자리수 개수
		while(true)					// 자리가 몇 개 있는지 체크
		{
			if(value/i < 10)		// 1의 자리가 되면 종료
				break;
						
			i*=10;
			++count;
		}

		int maxCount = arrIndex[0];
		int nine = 0;
		for(int k = 0; k < count; ++k)
		{
			int num = value/i;
			if(9 == num || 6 == num)
			{
				++nine;
			}
			else
			{
				++arrIndex[num];
				if(arrIndex[num] > maxCount)
					maxCount = arrIndex[num];
			}
			
			// 값을 뺀다
			value = value - (i*num); 
			i*=0.1f;
		}
		
		if(maxCount <= nine/2)
			maxCount += ((nine%2) + (nine/2) - maxCount);
		
		System.out.println(maxCount);
	}
}

BeeHouse

2018-11-04 00:00:00 +0000

문제

https://www.acmicpc.net/problem/2292

문제 풀이

  • 벌집의 모양을 2차원 배열로 풀면 다음과 같다
  • 0번째 배열 : [1]
  • 1번째 배열 : [2][3][4][5][6][7]
  • 2번째 배열 : [8][9][10][11][12][13][14][15][16][17][18][19] ….

0번째=>1번째 배열을 넘어갈 때 제외하고 6개씩 늘어난다.
벌집이 6각형인데 다음 배열로 넘어가면 3면은 기존벌집과, 3면은 새로운 벌집과 만나게 된다.
여기서 같은 배열끼리 중복해서 닿은 걸 빼면 6면이 추가로 맞닿게 된다.
이건 아무리 벌집이 많아져도 동일하다.
(계차수열 문제)

Source

import java.util.Scanner;
public class Main {
       public static void main(String[] args) {
              Scanner sc = new Scanner(System.in);
              int index = sc.nextInt();
              int count = index;
              int i = 1;
              while(count > 1)
              {
                     count = count - (6*i);
                     
                      ++i;
                     if(0 >= count)
                           break;
              }
              System.out.println(i);
       }
}

Git Reset, Revert

2018-11-03 00:00:00 +0000

reset

  • git reset version –option
  • 특정 상황으로 되돌아가고 싶을 때 사용. version 이후 커밋은 사라진다(로그에도 reset했다는 내용이 남지 않음)
  • –option은 hard, mix, soft가 있다
  • reset은 내 컴퓨터에 있는 작업일 경우에만 해야한다. 원격 저장소에 올려져있는 내용을 하면 안됨

revert

  • git revert version id
  • revert하면 reset과 달리 새로운 version이 생긴다
  • 현재version <-> 되돌아간 verison 사이에 변경 된 파일이 working copy 에 들어가는 것 같다
  • revert 로그가 바로 보이지 않고 해당 파일 수정 후 커밋해야 한다
  • 충돌했는지 꼭 해당 파일을 확인할

Git Log

2018-11-03 00:00:00 +0000

git log 명령어

  • git log
    • git의 이력을 볼 수 있다
  • git log -p 명령어
    • 각각의 소스사이에 차이점을 알 수 있다
  • git log -p 예시
    • 아래로 갈수록 예전에 commit한 내용이다
    • 이전 커밋 버전은 —을 나타내고, 지금 버전은 +++을 나타낸다
    • f2.text doc2 로그를 보면 이전 버전이 — /dev/null 이다. 이전 버전에선 f2.text가 존재하지 않았다는 뜻이다
    • +i’m happy, +modify 는 추가된 내용을 의미한다
    • commit은 해당 로그의 고유한 주소를 의미한다
    • git log commitid
      • commitid 커밋 로그까지 볼 수 있다
doc2:
    diff --git a/f2.text b/f2.text
    new file mode 100644
    index 0000000..8ffce26
--- /dev/null
+++ b/f2.text
@@ -0,0 +1 @@
+i'm happy
commit c2e948e301602580d08e9260ebf2bdfd9eafb073
Author: parkwonhui <parkwonhui.dev@gmail.com>
Date:   Sat Nov 3 13:15:10 2018 +0900
    modify!
diff --git a/text.txt b/text.txt
index 9a80b23..9281633 100644
--- a/text.txt
+++ b/text.txt
@@ -1,2 +1,3 @@
hello
first git!
+modify

git diff 명령어

  • git diff
    • 커밋하기 전에 변경사항을 알려준다(stage area는 사용x)
  • git diff commit id..commit id
    • 첫번째 commit id와 두번째 commit id 사이에 변경점을 말해준다
    • git diff 9d5eb39d054fa25f297284f9314dd3e748ee6fdf..bb5bb7ced2d628b692b78fdfceb45401fff1777b
diff --git a/f2.text b/f2.text
new file mode 100644
index 0000000..8ffce26
--- /dev/null
+++ b/f2.text
@@ -0,0 +1 @@
+i'm happy
diff --git a/text.txt b/text.txt
index 9a80b23..9281633 100644
--- a/text.txt
+++ b/text.txt
@@ -1,2 +1,3 @@
 hello
 first git!
+modify

Posts

subscribe via RSS