TIL - Getter/Setter | .this와 this() | Git 사용하기

su·2023년 5월 24일
1

TIL

목록 보기
8/93
post-thumbnail

문제1 - 접근제어자 private - Getter, Setter

1) 문제

private에 어떻게 접근해야 할까?
private는 접근 제어자이며 같은 클래스 내에서만 접근이 가능하다.
하지만 private로 선언된 필드를 다른 클래스에서도 사용할 경우가 생긴다면?
다시 그에 맞게 새로운 필드를 만드는 것은 번거로운 일이니,
그 클래스 내에 private에 접근할 수 있도록 하는 Getter와 Setter를 사용하면 된다고 한다.

2) 시도

그렇다면, 코드를 작성해보자 !
Phone이라는 클래스를 생성하고,
double 타입의 배터리 값을 나타내는 battery 필드 하나와
boolean 타입의 배터리 충전 여부인 charge 필드 하나를 생성해주었다.

public class Phone {
	// 초기값을 설정해주어도 된다
	private double battery;
    private boolean charge;
    
    // Getter - 값을 가져온다
    // 이름 규칙: get+필드이름(첫글자 대문자)
    public double getBattery() {
    	return battery;
    }
    public boolean getCharge() {
    	return charge;
    }
    
    // Setter - 값을 설정한다
    // 이름 규칙: set+필드이름(첫글자 대문자)
    // 접근할 때 this 키워드를 사용해주는 것이 좋다
    public void setBattery(double battery) {
    	this.battery = battery;
    }
    public void setCharge(boolean charge) {
    	this.charge = charge;
    }
}

현재 Phone이라는 클래스 내부에 private 접근 제어자로
double 타입의 battery와 boolean 타입의 charge 필드 두 개를 생성했다.
각 필드에 접근하기 위한(getter) 메소드인 getBattery, getCharge를 생성했다.
마지막으로 각 필드 값을 설정해주기 위한(setter) 메소드인 setBattery, setCharge를 생성했다.

3) 해결

이제 다른 클래스에서 접근이 가능한지 확인해보려고 한다.
새로운 Main 클래스를 만들어주고,
Phone클래스를 이용해 객체를 하나 생성한다. (이름은 phone)

public class Main{
	// 새로운 phone 객체 생성
	Phone phone = new Phone();

	// Phone 클래스의 battery, charge 변수 값을 설정해보자
    phone.setBattery(98.8);
    phone.setCharge(true);
    
    // 설정한 변수 값이 나오는지 출력해보자
    System.out.println("현재 배터리: "+phone.getBattery()+"%");
    System.out.println("충전 여부: "+phone.getCharge());
}

battery값과 charge값을 각각 98.8, true로 설정해주고
제대로 설정이 되었는지 get으로 출력해보려고 한다.

정상적으로 출력이 되었다 ..!

이번에는 원래 Phone 클래스의 필드에 초기값을 설정해보았다.

private double battery = 90.0;
private boolean charge = false;

이렇게 코드를 변경해도 Main 클래스에서 setter와 getter를 이용하면,
Main 클래스에서 할당해준 값으로 정상 출력된다!

4) 배운 점

(prac.java, prac2.java)
외부에서 접근이 불가능하도록 private로 필드를 선언했지만,
외부에서 접근을 해야 하는 경우가 있는데 그 경우를 위해서 getter, setter 메소드를 생성해주면 된다(접근제어자는 public).

getter 메소드 선언setter 메소드 선언
get + 필드명 (첫 글자 대문자로)set + 필드명 (첫 글자 대문자로)

이렇게 메소드를 설정해주면, 다른 클래스에서도 해당 필드에 접근할 수 있다
또 private와 final을 같이 사용할 필요는 없다고 한다..!
(final은 마지막이라는 의미답게 더 이상 그 값을 다른 곳에서 바꿀 수 없는데, private도 외부에서는 값을 조회하거나 설정할 수 없으므로 같이 사용할 필요가 없는 듯 하다)

문제2 - this - .this 와 this()

1) 문제

문제는 나에게 있다.
정확하게 이해가 되지 않았다 ...
this에 의미는 알겠는데, 어떻게 사용하면 좋을지 감이 잡히지 않았다 ..
나도 한 번에 이해하고 싶다 /_ /

2) 시도

코드를 작성해보자 .. this를 사용하기 위해서 !

public class Phone {
    String type;
    int battery;
    boolean charge;
    
    // 입력받는 변수 명이 존재하는 필드명과 같을 경우
    // 자기 자신에게 값을 대입하는 상황이 되므로 this를 사용
    // 생성자
    public Phone(String type, int battery, boolean charge) {
        this.type = type;
        this.battery = battery;
        this.charge = charge;
    }
    
    public static void main(String[] args) {
        Phone phone_2 = new Phone("아이폰 14", 90, true);

        System.out.println("휴대폰 종류: " + phone_2.type);
        System.out.println("배터리 잔량: " + phone_2.battery + "%");
        System.out.println("충전 여부: " + phone_2.charge);
    } // main 메소드
}


설정한 값으로 잘 출력이 된다!

지금은 기본 생성자를 만들어주지 않아서 값을 대입해주어야 하는데,
초기값이 설정되어있는 기본 생성자도 만들어서 함께 test 해보자.

public class Phone {

    String type;
    int battery;
    boolean charge;

    // 기본생성자
    public Phone() {
        this.type = "갤럭시 23";
        this.battery = 100;
        this.charge = false;
    }
    // 생성자
    public Phone(String type, int battery, boolean charge) {
        this.type = type;
        this.battery = battery;
        this.charge = charge;
    }

    public static void main(String[] args) {
        Phone phone = new Phone();                      // 기본생성자
        Phone phone_2 = new Phone("아이폰 14", 90, true);

        System.out.println("휴대폰 종류: " + phone.type);
        System.out.println("배터리 잔량: " + phone.battery + "%");
        System.out.println("충전 여부: " + phone.charge);

        System.out.println("-----------");
        System.out.println("휴대폰 종류: " + phone_2.type);
        System.out.println("배터리 잔량: " + phone_2.battery + "%");
        System.out.println("충전 여부: " + phone_2.charge);
    } // main 메소드
}


잘 출력이 되는 모습을 확인할 수 있다.

3) 해결

.this와 this() 키워드를 함께 쓰는 코드로 변경해보자!

public class Phone {

    String type;
    int battery;
    boolean charge;

    // 기본생성자
    public Phone() {
    	this("갤럭시 23", 100, false);
    }
    // 생성자 1
    public Phone(String type) {
    	this(type, 100, false);
    }
    // 생성자 2
    public Phone(String type, int battery) {
    	this(type, battery, false);
    }
    // 생성자
    public Phone(String type, int battery, boolean charge) {
        this.type = type;
        this.battery = battery;
        this.charge = charge;
    }

    public static void main(String[] args) {
        Phone phone = new Phone();
        Phone phone_2 = new Phone("갤럭시 22");
        Phone phone_3 = new Phone("아이폰 13", 95);
        Phone phone_4 = new Phone("아이폰 14", 90, true);

        System.out.println("휴대폰 종류: " + phone.type);
        System.out.println("배터리 잔량: " + phone.battery + "%");
        System.out.println("충전 여부: " + phone.charge);

        System.out.println("-----------");
        System.out.println("휴대폰 종류: " + phone_2.type);
        System.out.println("배터리 잔량: " + phone_2.battery + "%");
        System.out.println("충전 여부: " + phone_2.charge);

        System.out.println("-----------");
        System.out.println("휴대폰 종류: " + phone_3.type);
        System.out.println("배터리 잔량: " + phone_3.battery + "%");
        System.out.println("충전 여부: " + phone_3.charge);

        System.out.println("-----------");
        System.out.println("휴대폰 종류: " + phone_4.type);
        System.out.println("배터리 잔량: " + phone_4.battery + "%");
        System.out.println("충전 여부: " + phone_4.charge);
    } // main 메소드
}


원하는대로 코드가 잘 출력이 되는 모습을 확인할 수 있었다.

4) 배운 점

(Phone.java)
.this와 this()를 어떤 상황에서 사용하면 좋을지 감이 잡히지 않았는데,
코드를 작성해보니 어느정도 감이 잡힌 듯 하다.

this 자체는 객체(=인스턴스 자신)을 표현하는 키워드로
객체 내부의 생성자 · 메서드에서 객체 내부 멤버에 접근하기 위해 사용된다고 한다.
.this는 매개변수명과 객체 내의 필드명이 일치할 경우 사용하고,
this()는 객체 (=인스턴스 자신)의 생성자를 호출하는 키워드이므로 객체 필드 초기화 시 중복되는 코드를 줄이기 위해서 사용한다.

내 코드에서도 this()를 사용하고 난 후에 코드가 더 간결해진 모습을 확인할 수 있었다.
다른 코드를 작성할 때도 적용해봐야겠다.

문제3 - Git 내 레퍼지토리에 Push

1) 문제

모든 것이 문제다 ..
안해본 것을 우다다 배우려니 째그만 두뇌에 그게 다 들어갈 리가 .. ^^ 당연히 없다.
일단은 나의 계정에 레퍼지토리를 생성하고
그 레퍼지토리에 내 파일을 push 하는 과정을 혼자서 해보려고 한다.

2) 시도

일단 gitHub에서 레퍼지토리를 하나 생성한다.

나는 test-repo라는 이름으로 생성했다.

빈 레퍼지토리를 생성하고 나면

하단에 이런 문장이 있고 그 아래에 코드가 있다.
아래에 코드가 3줄이 있는데, 이 코드를 git bash here을 열고 하나씩 실행해주면 된다

그 전에!

$ git init

을 실행하지 않았다면 실행해주어야 한다!

// 본인 레퍼지토리와 연결하기 (origin이라고 부름)
$ git remote add origin "본인 gitHub 레퍼지토리의 SSH"
// branch 이름 변경하기
$ git branch -M main
// 레퍼지토리에 push 하는 명령어
$ git push -u origin main

이렇게 세 문장인데,
첫번째 두번째는 연속으로 실행해주면 된다.
그리고 세 번째 문장을 실행한 순간?

error: src refspec main does not match any
error: failed to push some refs to '본인 gitHub 레퍼지토리'

오류가 났다 ..^^
순서대로 실행했는데 ,, 무엇이 문제일까 바로 바로 검색해봤다.
이유는 바로..
커밋을 하지 않았기 때문이었다..
아니.. 파일을 추가해주고, 커밋을 하고, 그다음에 push 인데
마음이 너무 급했는지 ^^ 냅다 push를 해버리는 바람에 오류가 난 것이다

$ git add '파일명'
$ git commit -m "커밋 메세지"

이렇게 작성 하고 실행해준 뒤

$ git push -u origin main

push를 진행하면 ? 성공했다는 것을 gitHub에서 확인할 수 있었다.

3) 해결

에러 메세지는 검색해보니 바로 해결책이 나와 다행이었다.

// .git 폴더 생성
$ git init
// 생성한 레퍼지토리와 연결하기
$ git remote add origin "본인 gitHub 레퍼지토리의 SSH"
// branch 이름 main으로 변경하기
$ git branch -M main
// 파일 추가하기 (파일 경로 주의)
$ git add 파일명
// 커밋(commit) 하기
$ git commit -m "커밋 메시지"
// push 하기
$ git push -u origin main(해당 브랜치 이름)

이렇게 실행하면 된다고 한다..!

4) 배운 점

아직은 어렵다는 생각이 든다 ,,
익숙해지도록 작성한 코드를 git bash로 gitHub에 옮겨봐야겠다 ..

그리고 branch 관련 명령어도 익혀둬야겠다

// branch 생성
$ git branch <브랜치이름>
// branch 이동
$ git checkout <브랜치이름>
// branch 생성 & 이동 한 번에
$ git checkout -b <브랜치이름>

문제4 - Git으로 협업하기 (풀 리퀘스트 Pull Request)

1) 문제

Git으로 협업하려고 했을 때,
내 레퍼지토리에는 나만 접근이 가능하므로 Collaborator을 이용해 접근할 수 있는 사람을 추가할 수 있다고 한다.
하지만 그렇게 권한을 허용할 경우에 모두가 pull을 하려고 하면 충돌이 일어날 가능성이 매우 높기 때문에, 풀 리퀘스트 방식을 사용한다고 한다.
처음 들어봤다 .. 완전 생소한 개념이라 다시 복습해보고자 작성하려고 한다.

2) 시도

우선 순서는 이렇다.

  1. 기여하려는 저장소를 내 계정으로 Fork 해온다.
  2. Fork 해온 저장소를 Clone 한다.
  3. 브랜치를 생성한 후 (main/master가 아닌) 생성한 브랜치에서 작업한다.
  4. 작업한 브랜치를 Push 한다.
  5. 풀 리퀘스트를 보낸다.
  1. 다른 사람의 레퍼지토리에 들어가면
    오른쪽 상단 쯤에 Fork 가 있다.

    Fork가 완료되면,
    내 저장소에서 Clone을 해주면 된다.
  1. 원하는 위치에서
    $ git clone '본인 레퍼지토리의 SSH'
    을 입력하고 실행해주면 된다.
    이 코드는 새로운 레퍼지토리를 생성했을 때의 코드와 유사한 형태로
    내 계정으로 Fork 해온 레퍼지토리의 SSH 를 입력해야 한다 !!
  1. 이제 브랜치를 생성한다.

    $ git branch 브랜치 이름

    생성이 되었다면 생성한 브랜치로 이동한다.

    $ git checkout 브랜치 이름

    생성과 이동이 한 번에 가능한 코드도 있다

    $ git checkout -b 브랜치 이름

    그 후에 branch에서 작업하면 된다!
    파일을 추가하거나 수정하고 commit 하면 된다.

  2. 이제 작업한 branch를 push 해주어야 하는데, 이 때 다시 main/master로 돌아가는 것이 아니라 작업했던 그 branch에서 진행하는 것임을 주의해야 한다.

    $ git push origin 브랜치이름

    이렇게 push를 하면 내 레퍼지토리에 변경 사항이 push 된 것을 확인할 수 있다.

  3. 이제 남은 것은 풀 리퀘스트를 보내는 것이다!
    push를 완료하고 내 레퍼지토리로 돌아오면, Compare & pull request 버튼을 누를 수 있다.
    이 버튼을 누르고 메시지를 작성하여 Create pull request를 하면 된다!

3) 해결

선생님께서 알려주신 대로 침착하게 진행하면 가능하다 .
순서를 기억하면서 git 코드도 잘 익혀두어야 할 듯 하다 .
다시 한 번 정리해보면

  • Fork 해오기
    • 다른 사람의 레퍼지토리에서 내 계정으로 Fork 해온다
  • Fork 해온 저장소를 내 쪽에 Clone 해오기
    • 내 로컬 저장소에서 작업해야 하므로, 복제를 해야 한다.
    • 원하는 위치에서 git bash here을 켜고,
      $ git clone 'Fork해 와서 생성된 레퍼지토리 SSH'
      를 실행한다.
  • 복제가 완료되면 브랜치 생성 후 그 브랜치에서 작업한다.
    • $ git checkout -b 브랜치이름
      으로 브랜치를 생성하고 이동한다.
    • 생성한 브랜치에서 작업한다 (add, commit)
      $ git add 파일명
      $ git commit -m "commit 메시지"
  • 내 레퍼지토리로 push 한다.
    • $ git push -u origin 브랜치이름
    • 주의할 점은 생성하고 이동해서 작업한 그 브랜치 이름으로 push 하는 것이다
  • 풀 리퀘스트 보내기
    • push까지 완료되었다면 풀 리퀘스트를 보내면 된다
    • 어떤 코드를 작성했는지 자세히 설명해주는 것이 좋다고 한다

4) 배운 점

연습만이 살길이다..
순서를 까먹지 말고, 침착하게 다시 실행해보고 싶은데,,
다른 분의 레퍼지토리에 해야 하는 일이라 혼자서는 재실행이 불가능하다 ..
여기 적어놓은 대로 진행하면 괜찮을 듯 하다 ..!

풀 리퀘스트라는 것을 처음 알았는데,
협업할 때 많이 사용한다고 하니 반드시 머릿속에 넣어야겠다.
그리고 풀 리퀘스트는 gitHub 상에서 코드 변경내용에 대해 의견을 공유한 것이 기록으로 남는다고 한다..!
어떤 방식으로 프로젝트가 진행되었는지 알아보기 쉬운 좋은 방법인 듯 하다

profile
(❁´◡`❁)

0개의 댓글