JAVA1

나의 앱 만들기 2

수업소개

배우지 않은 개념을 이용해서 나의 앱을 만들어봅시다. 앞으로 여러분이 공부해볼만한 주제들을 소개하는 시간이기도 합니다. 다 보려고 하지 마시고, 흥미 있는 부분까지만 보시면 됩니다. 

 

 

 

강의 5

 

 

 

강의 6

소스코드

변경사항

public class AccountingIFApp {

    public static void main(String[] args) {

		double valueOfSupply = Double.parseDouble(args[0]);
		double vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = valueOfSupply * vatRate;
		double total = valueOfSupply + vat;
		double expense = valueOfSupply * expenseRate;
		double income = valueOfSupply - expense;
		
		double dividend1;
		double dividend2;
		double dividend3;
		
		if(income > 10000.0) {
			dividend1 = income * 0.5;
			dividend2 = income * 0.3;
			dividend3 = income * 0.2;
		} else {
			dividend1 = income * 1.0;
			dividend2 = income * 0;
			dividend3 = income * 0;
		}

		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + vat);
		System.out.println("Total : " + total);
		System.out.println("Expense : " + expense);
		System.out.println("Income : " + income);
		System.out.println("Dividend 1 : " + dividend1);
		System.out.println("Dividend 2 : " + dividend2);
		System.out.println("Dividend 3 : " + dividend3);

	}

}

 

 

 

강의 7

소스코드

변경사항

public class AccountingArrayApp {

    public static void main(String[] args) {

		double valueOfSupply = Double.parseDouble(args[0]);
		double vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = valueOfSupply * vatRate;
		double total = valueOfSupply + vat;
		double expense = valueOfSupply * expenseRate;
		double income = valueOfSupply - expense;
		
		double[] dividendRates = new double[3];
		dividendRates[0] = 0.5;
		dividendRates[1] = 0.3;
		dividendRates[2] = 0.2;
		
		double dividend1 = income * dividendRates[0];
		double dividend2 = income * dividendRates[1];
		double dividend3 = income * dividendRates[2];

		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + vat);
		System.out.println("Total : " + total);
		System.out.println("Expense : " + expense);
		System.out.println("Income : " + income);
		System.out.println("Dividend 1 : " + dividend1);
		System.out.println("Dividend 2 : " + dividend2);
		System.out.println("Dividend 3 : " + dividend3);

	}

}

 

 

 

강의 8

소스코드

변경사항

public class AccountingArrayLoopApp {

    public static void main(String[] args) {

		double valueOfSupply = Double.parseDouble(args[0]);
		double vatRate = 0.1;
		double expenseRate = 0.3;
		double vat = valueOfSupply * vatRate;
		double total = valueOfSupply + vat;
		double expense = valueOfSupply * expenseRate;
		double income = valueOfSupply - expense;
		
		

		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + vat);
		System.out.println("Total : " + total);
		System.out.println("Expense : " + expense);
		System.out.println("Income : " + income);
		
		double[] dividendRates = new double[3];
		dividendRates[0] = 0.5;
		dividendRates[1] = 0.3;
		dividendRates[2] = 0.2;
		
			
		int i = 0;
		while(i < dividendRates.length) {
			System.out.println("Dividend : " + (income*dividendRates[i]) );
			i = i + 1;
		}
		

	}

}

 

 

 

강의 9

소스코드

변경사항

public class AccountingMethodApp {
    public static double valueOfSupply;
	public static double vatRate;
	public static double expenseRate;
	public static void main(String[] args) {
		valueOfSupply = 10000.0;
		vatRate = 0.1;
		expenseRate = 0.3;
		print();
	}

	public static void print() {
		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + getVAT());
		System.out.println("Total : " + getTotal());
		System.out.println("Expense : " + getExpense());
		System.out.println("Income : " + getIncome());
		System.out.println("Dividend 1 : " + getDiviend1());
		System.out.println("Dividend 2 : " + getDiviend2());
		System.out.println("Dividend 3 : " + getDiviend3());
	}

	public static double getDiviend1() {
		return getIncome() * 0.5;
	}
	public static double getDiviend2() {
		return getIncome() * 0.3;
	}
	public static double getDiviend3() {
		return getIncome() * 0.2;
	}

	public static double getIncome() {
		return valueOfSupply - getExpense();
	}

	public static double getExpense() {
		return valueOfSupply * expenseRate;
	}

	public static double getTotal() {
		return valueOfSupply + getVAT();
	} 

	public static double getVAT() {
		return valueOfSupply * vatRate;
	}

}

 

 

강의 10

소스코드

변경사항

class Accounting{
    public static double valueOfSupply;
	public static double vatRate;
	public static double expenseRate;
	public static void print() {
		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + getVAT());
		System.out.println("Total : " + getTotal());
		System.out.println("Expense : " + getExpense());
		System.out.println("Income : " + getIncome());
		System.out.println("Dividend 1 : " + getDiviend1());
		System.out.println("Dividend 2 : " + getDiviend2());
		System.out.println("Dividend 3 : " + getDiviend3());
	}

	public static double getDiviend1() {
		return getIncome() * 0.5;
	}
	public static double getDiviend2() {
		return getIncome() * 0.3;
	}
	public static double getDiviend3() {
		return getIncome() * 0.2;
	}

	public static double getIncome() {
		return valueOfSupply - getExpense();
	}

	public static double getExpense() {
		return valueOfSupply * expenseRate;
	}

	public static double getTotal() {
		return valueOfSupply + getVAT();
	} 

	public static double getVAT() {
		return valueOfSupply * vatRate;
	}
}
public class AccountingClassApp {
	
	public static void main(String[] args) {
		Accounting.valueOfSupply = 10000.0;
		Accounting.vatRate = 0.1;
		Accounting.expenseRate = 0.3;
		Accounting.print();
		// anotherVariable = ...;
		// anotherMethod = ...;
	}

	

}

 

 

 

강의11

소스코드

변경사항

class Accounting{
    public double valueOfSupply;
	public double vatRate;
	public double expenseRate;
	public void print() {
		System.out.println("Value of supply : " + valueOfSupply);
		System.out.println("VAT : " + getVAT());
		System.out.println("Total : " + getTotal());
		System.out.println("Expense : " + getExpense());
		System.out.println("Income : " + getIncome());
		System.out.println("Dividend 1 : " + getDiviend1());
		System.out.println("Dividend 2 : " + getDiviend2());
		System.out.println("Dividend 3 : " + getDiviend3());
	}

	public double getDiviend1() {
		return getIncome() * 0.5;
	}
	public double getDiviend2() {
		return getIncome() * 0.3;
	}
	public double getDiviend3() {
		return getIncome() * 0.2;
	}

	public double getIncome() {
		return valueOfSupply - getExpense();
	}

	public double getExpense() {
		return valueOfSupply * expenseRate;
	}

	public double getTotal() {
		return valueOfSupply + getVAT();
	} 

	public double getVAT() {
		return valueOfSupply * vatRate;
	}
}
public class AccountingClassApp {
	
	public static void main(String[] args) {
		// instance 
		Accounting a1 = new Accounting();
		a1.valueOfSupply = 10000.0;
		a1.vatRate = 0.1;
		a1.expenseRate = 0.3;
		a1.print();
		
		Accounting a2 = new Accounting();
		a2.valueOfSupply = 20000.0;
		a2.vatRate = 0.05;
		a2.expenseRate = 0.2;
		a2.print();
		
		a1.print();
	}
}

 

댓글

댓글 본문
  1. 싱와
    인스턴스는 기존에 있던 클래스의 메소드를 그대로 쓰고 싶은데, 데이터 값이 상시로 다르게 들어가야할때 쓰여요.

    그래서 (해당클래스의이름) (내가설정한변수의이름) = new (해당클래스의이름)();

    과 같은 형태를 띕니다.

    인스턴스를 사용하기 위해서는 기존에 있던 클래스의 static 을 모두 삭제해주어야 하는데요, 해당클래스에서만 쓸것이 아니라, 복제된 클래스에서도 동일한 기능을 해주어야 하기때문에 그 lock 을 풀어줄 필요가 있기 때문이라고 생각합니다.

    클래스는, 찐이고, 인스턴스는 동일한 기능을 하는 놈이지만, 데이터값이 다른놈이에요.
    클래스와 인스턴스를 이용해서 구조를 더욱 깔끔하게 바꿀 수 있습니다.
  2. 싱와
    메소드는 서로 연관된 코드를 그룹핑해서 이름을 붙인 정리정돈의 작은 상자에요.
    작은 상자라고 이름붙인 이유에는 큰 상자도 있기 때문이에요.

    메소드를 쓰면 클래스 내부에서 복잡하고 난잡하게 널부러져 있는 코드들을 가독성 있게 정리할 수 있어요.
    MAC운영체제 기준, 옵션 + 커맨드 + M 버튼을 누르면 나만의 메소드를 만들 수 있답니다.

    아까 말했던, 큰 상자도 있어요, "클래스"라고 합니다.
    클래스는 서로 연관된 메소드나 변수들을 그룹핑해서 이름을 붙인 정리정돈의 큰 상자에요.

    이번강의에서는 클래스 내부에 연관되지 않은 메소드들이 있을때의 대처법도 배웠는데요,
    이때는 새로운 클래스를 기존 클래스 밖에 하나 만들어서, 관련된 메소드와 변수들을 그쪽으로 빼내고,
    Account 라는 새로운 클래스를 만들었다고 했을시에는,
    Account.newprofile() 과 같이 어카운트 내부에 있는 메소드라는것을 정확하게 명시하여
    다른 메소드 들과 명확하게 구분지을 수 있게 해줄 수도 있답니다!.

    즉, 코드 -> 메소드, 변수 -> 클래스 -> 패키지 순입니다.
  3. 싱와
    배열은 코드가 길어지고, 논리적으로 복잡해졌을때 코드를 정리정돈하는데 많이 쓰여요.
    공사장에 가면 자재들을 잘 정리해두고 하는것들이 중요한데, 현장이 더럽혀져 있으면 정확하게 기구들을 찾을수도 없고 일의 속도가 느려지기 때문이에요.

    우리가 앞으로 마주할 코드들은 점점 길어지고 복잡해지고 변수도 많아질텐데,
    배열을 이용해서 비슷한 성질의 변수들을 묶어주면 깔끔하게 정리도 되고, 변수의 값이 중간에 더럽혀질 가능성도 없어서
    배열을 씁니다.

    배열은 이후에 배울 반복문과 결합하면 미친듯한 효율이 나요.
  4. 싱와
    조건문은 한 상황에서 조건이 달라졌을때에 다른 결과를 내고 싶을때 사용할것 같아요!
  5. 2020.10.17 완료!
  6. 준서
    1. 조건문 if(){}
    2. 배열 (Type)[]
    3. 반복문 while(){}
    4. 메소드
    -함수 기능. input을 없애려면 클래스 수준의 public 변수 선언이 필요(main이랑 메소드랑 동급)
    5. 클래스
    -변수나 메소드 모아놓고 뽑아쓰기 위해 만든 디렉토리. main이 있는 파일명 실행 클래스가 주축
    -특정 클래스 내 변수나 메소드 호출을 위해서는 class.method(); 형태 사용
    -public: 전역, private: 지역(그 클래스 내에서만 사용)
    6. 인스턴스
    -지정(class instance = new class();)할 때 클래스 복사본 생성. 복사본에서는 어떤짓을 해도 원본에 영향 없음.
    -사용할 때는 클래스 이름을 인스턴스 이름으로 바꾸어 사용
    -static: 정해진 메소드 or 변수. 복제 클래스에서 뭐 건드리는 인스턴스 쓰고 싶으면 사용 자제.
  7. 강의9 메소드편 08:18 에서요 getTotal에 return에서 getVAT() 를 그대로 가져오는건 어떻게 가능한거죠??

    그전에 getVAT() 메소드를 만들때 return에서 valueOfSupply 값을 가져오는게 안됐어서 main메소드에 있던 값을 필드화 시킨거자나요

    왜 이같은 단계를 다시 거치지 않는건지 궁금합니다. 값이 변수가 아니라 메소드끼리는 혹시 그런 제약이 없는건가요??


    ****
    계속 고민해보니 혹시 04:39 에 나왔던 저기 어디에 숨겨놨던 곳에서 호출해오는 것이기 때문에 가능한것 일까요? 이게 맞다고 생각을해야 다음 진도를 나갈수 있겠습니다 ㅠㅠ
  8. 치디우기
    20200903 수강~
  9. Gyeong Min Lee
    ㅇㄹ
  10. lieinm
    왜 인스턴스를 사용하려면 전역변수 선언인 static 을 지워야 하는 건가요?
    static을 지우려면 클래스에 변수 전달을 못하지 않나요?
  11. 객체지향 프로그래밍의 핵심인 클래스와 인스턴스

    클래스
    - 관련있는 변수들과 메소드들을 묶어 이름을 붙인 정리정돈 상자.

    인스턴스
    -서로 다른 데이터값을 가진 채로 서로 같은 메소드들을 공유할 수 있게 클래스를 복제해서 다른 데이터값을 부여해준 복제품 class instance = new class();
  12. 재도전
    8/11 와뇰
  13. 프로그래머Y
    매소드는 서로 연관된 코드들을 한데 모아서 정리정돈한 상자같은 개념이다.
  14. 프로그래머Y
    반복은 너무 많은 반복적인 코드를 작성해야할 때, 단 한두 줄로 코드를 마무리할 수 있게 해주는 기능을 한다.
  15. 프로그래머Y
    배열은 우리가 만든 변수의 이름이 흔한 이름인 경우 누군가 실수로 그 이름을 또 다시 사용하여 잘못 동작할 수 있는 가능성이 있는 경우에 사용된다.
    배열을 통해 잘못된 사용을 줄이고 좀 더 깔끔한 코드를 만들 수 있다.
  16. 블르므드
    인스턴스
    하나의 클래스를 복제할 수 있는 것.
    ex. Accounting a1 = new Accounting();
    이 때, Accounting의 함수는 a1이라는 인스턴스에 종속되며
    a1.print(); 처럼 인스턴스.메소드(); 형태로 사용할 수 있다.
  17. 블르므드
    class > public class > private class?

    메서드를 class로 들여보낼 때 private로 걸려있으면 동작하지 않는다.
  18. 블르므드
    메서드는 무엇인가 변수 혹은 동작 함수를 모아놓은 상자와 같은 것이다.
    자바에서의 while문은
    int i = 0;
    while(i<배열.length){
    sout~~} 과 같은 형태로 사용한다.

    지역변수 : 뭔지는 모르겠는데 static 안에서만 작동하는 변수
    전역변수 : class에 상속되어 해당 class의 어느 static이든 호출하여 사용할 수 있는 변수
  19. Jimin Joo
    조건문을 사용하면 좋을 것 같은 상황 : 위와 같이 사용자에 따라 입력값이 다양하게 있을 때 / 직접 계산하지 않기 힘든 계산이 많이 있을 때

    배열은 변수를 하나 지정하고 같은 타입의 내용을 순차적으로 담아놓은 묶음
    0이 첫 번째인 것에 유의하자

    반복문 : 배열과 함께 쓰일 때 좋은 시너지, 아직 둘을 함께 잘 사용하는 법은 모르겠으나 차차 배워나가자!
    int i = 0;
    while(i<){
    Syetem.out.println()
    }

    메소드 : 서로 연관된 코드를 그룹핑해 이름을 붙인 정리정돈의 상자다
    메소드는 너무 길고 복잡한 수식/코드가 꼴보기 싫을 때 확 정리해버릴 수 있는 문법!

    인스턴스 : 이해하기 너무 어렵다....하 여튼 형태 : new 클래스 / static 사용되면 안됨
    메소드로 구조를 잡고 메서드+변수의 클래스로 구조를 잡고 클래스 모음으로 다시 구조를 잡는 자바 언어!
  20. 선대범
    조건문 if{} else{}
    배열
    double[] dividendRates = new double[3];
    dividendRates[0] = 0.5;
    dividendRates[1] = 0.3;
    dividendRates[2] = 0.2;
    반복문
    while(i < dividendRates.length) {
    System.out.println("Dividend : " + (income*dividendRates[i]) );
    i = i + 1;

    ㄴ코드의 무의미한 반복을 줄여주고 깔끔한 코딩

    메소드 : 서로 연관된 코드를 그루핑해서 이름을 붙힌 정리정돈 상자다
    객체
    필드 전역변수 (main 위에 설정)
    클래스 서로 연관된 변수와 메소드를 그루핑하고 이름을 붙힌 정리정돈 상자다
    인스턴스 단일 메소드 다중 변수
  21. 객체(필드+메소드) : 현실의 어떤 대상을 최대한 컴퓨터에 표현하기 위해 만든 것 상태(변수)와 메소드(행위)로 구성된다. 클래스와는 어떤 차이일까?

    필드(변수) : 원하는 값을 담기 위한 바구니! 또는 객체의 현재 상태 (자전거의 다양한 상태 예를들면 달리고있냐 서있냐, 자전거 속력, 핸들방향 등)

    메소드 : 객체의 동작, 객체의 상태를 변화시킬 수 있는 행위를 구현해놓은 것 (자전거를 멈춘다, 자전거의 속력을바꾼다, 핸들방향을 바꾼다)

    클래스 : 서로 연관된 변수와 메소드를 가져다 모아놓은 것. 객체와 어떤차이일까?

    인스턴스 : 기존 클래스를 변수값을 바꿔서 쓰고 싶을 때 클래스를 복사하여, 인스턴스를 생성할 수 있다. 변수를변경해주고, 해당 변수를 활용하는 메소드를 그대로 쓸 수 있다.
  22. 하승연
    메소드는 어떤 일을 처리하기 위한 함수이고
    클래스가 연관성 있는 메소드들과 변수들을 묶은 거에요.
    대화보기
    • 하승연
      그러니까 자바의 인스턴스는 c++의 객체와 비슷한 역할을 하는 건가요? 예를 들면 은행 클래스가 있다 치고 예금저축함수를 사용할 때 국민은행을 사용할 것인지, 농협을 사용할 것인지 은행이라는 단어만으로는 모르니까 클래스의 구조를 따 와서 각각의 인스턴스들에 은행명을 부여(a1, a2, 국민, 농협)하고 저마다의 저축과 같은 기능(함수)이나 금리(변수) 등의 요소들을 다르게 적용시키기 위해 필요한 거군요?
    • 밍블리
      메소드는 사용 전에 일단 코드를 다 짜놓고 나중에 정리하는 순서로 쓰면 되는거죠?
      처음부터 메소드 만들면서 코드 짜기는 엄청 숙련된 사람들은 가능한가요?.?
    • yechubot
      method는 정리정돈의 상자!
      객체지향- class, 관련된 변수와 메소드를 grouping 하는 것 - 또 다른 정리정돈 상자
      -instance, class 복제하고 다른 값을 사용....?
    • 발리에서생깐일
      double dividend 1
      double dividend 2
      double dividend 3
      이게 자바 스크립트 처럼 함수의 역활을 한다는 말씀이신거죠?
    • 그르니까 java에서의 method는 javascript의 함수와 비슷한 역할을 하는 거군요?
    • 브라이언
      강의 잘들었습니다.쏙쏙 개념이 들어오네요. 감사합니다.
    • 인스턴스
      Accounting a1 = new Accounting();
      a1이라는 Accounting 클래스를 복제해 만든다. 인스턴스를 만드는 법!
    • JAVA는 섬이름이래여!
      코로나 때문에 학교가 강제로 서울 사이버 대학교 가 되었는데...
      이참에 이고잉님도 교슈님 하시는게 어떤가요!!
      강의 잘 듣고있습니다.
    • 완료
    • 감사합니다 처음에는 코드를 따라 작성을하면서 하다보니까 놓치는부분이 많았던거 같네요ㅎ
      이번에는 다시한번 코드작성안하고 앱만들기1부터 영상만 보다보니까 안보였던 부분이 조금씩 보이고 이해가 아주 조금씩이지만 이해해가고 있습니다ㅋㅋ감사합니다 아직 한참 멀었지만 계속 보면서 복습해볼게요
      대화보기
      • 뉸찡
        2020.03.05
        감사합니다! 어려워서 다시한번 복습해야겠습니다
      • egoing
        여기서 다시 처음으로 돌아가서 반복하다보면 그 원심력으로 이 수업을 꿰뚫다 비상하실 겁니다. 기초의 위력을 실감하실 겁니다.
        대화보기
        • 퇴근후에 조금씩 진도를 나가서 그런지 나의 앱만들기2 페이지에서만 이틀째 머무르고 있네요..ㅠㅠ 이해가 안되는부분들이 너무많아서 멈추고 코드를 가만히 쳐다보고있는ㅋㅋㅋ
        • 감사합니다...
        • 소금설탕
          감사합니다.
        • 리리
          연관된 코드들을 묶은 상자 : 메소드
          연관된 변수들과 메소드들을 묶은 상자 : 클래스
          하나의 클래스를 복제하여 다른 값들을 넣어서 사용할 수 있게 만드는 것 : 인스턴스
          (인스턴스로 사용될 클래스의 변수와 메소드에는 static이 들어가면 안됨)
        • 라또마니
          메소드(method) : 함수
          메소드는 서로 연관된 코드를 그루핑해서 이름을 붙인 정리정돈한 상자이다.

          객체 : 클래스라는 표현을 쓰기도 하는데, 클래스는 서로 연관된 변수와 메소드를 그루핑 한 것이다. 거기에 이름을 붙인 것이다.

          인스턴스 : 하나의 클래스를 복제해서 서로 다른 데이터 값 과 서로 다른 메소드를 가진 복제본을 만드는 것이다.
        • jw1207j67@google.com
          최고입니다.
          정리가 쫙 되는 느낌입니다.
          감사합니다.
        • truespring
          밑에서 나누는 수를 표현하기 위하여 변수 j를 사용하였는데 이럴 필요없이 i를 사용할 수 있습니다.
          int i = 0;
          while (i < dividendRates.length) {
          System.out.println("Dividend " + (i+1) + " : " + (income * dividendRates[i]);
          i++;
          }
          굳이 변수 하나를 더 생성할 필요가 없어집니다.
        • 백인호
          Loop 에 방법인 while문 예제에서 divedend 0이 반복되는것이 불편하여서
          Multiple conditions in WHILE loop 라고 검색해보니
          int i = 0;
          int j = 1;
          while(i < dividendRates.length && j < 4) {
          System.out.println("Divedend " + j + ":" + (Income * dividendRates[i]) );
          i=i+1;
          j=j+1;
          }
          로 적용하니 divedend 가 1 2 3 이 순차적으로 나오네요.
        • 정훈
          수고하셨습니다.^^
        • 코리니
          와.. 나의 앱 만들기 시리즈가 정말 강력했던 거 같아요!!
          감사합니다!!
        • 휴~ ㅎㅎ 끝
          너무너무 감사합니다^^
        • 쑤우
          수강완료. 감사합니다~
        • 멋지게살자
          쭉 정리해 주셔서 감사합니다.
          그동안 궁금했던내용이 정리되었습니다.
          앞으로 정진할 일만 남았네요... 다시한번 감사드립니다.
        • 햄쮸맨
          근데 생각해보니 우리는 지금껏 하나의 클래스를 가지고 하나의 인스턴스만 만들어 왔다가 이제서야 하나의 클래스로 여러 인스턴스를 복제하는 법을 배운건가요?
        • 햄쮸맨
          메소드는 성질이 유사한 코드들을 묶어서 이름 붙인 덩어리군요!
          클래스는 메소드랑 변수 값들을 묶어놓은 덩어리고요!
          인스턴스는 클래스(붕어빵틀)을 이용해서 복제된 서로 다른 변수와 같은 메소드를 가진 붕어빵이네용.
        • 햄쮸맨
          조건문은 특정 조건에서 다른 동작을 수행 해야하는 경우에 사용되는 거군요!
          배열은 같은 분류의 데이터들을 한 변수에 담아서 사용할 수 있도록 한 거고요. 경우에 따라서는 문자열을 한글자씩 담아서 몇번째 글자만 따로 출력하는 것도 가능하겠네요.
          반복문은 특정 조건이 성취되기 이전까지 같은 동작을 반복 해야하는 경우에 사용하는 거군요!
          위에서는 배열과 함께써서 배열의 데이터가 끝난다는 조건이 성취 될때까지 배열의 데이터와 수입을 곱해서 나눔몫을 출력해줬네요! 둘이 함께 쓰이니까 효과가 참 좋네요!
        버전 관리
        egoing
        현재 버전
        선택 버전
        graphittie 자세히 보기