2016.01.15 01:08

소수점을 표현하는 경우


Double을 쓸 때가 많습니다.


그런데 좀 애매할 때가 있죠.


1과 1.5가 있을 때


Double을 써버리면


1.0과 1.5가 됩니다.


이럴 때 1.0은 보기가 안좋죠.


아래의 코드를 통해 다듬어봅시다.


#은 0일경우 표현하지 않습니다.


 DecimalFormat df=new DecimalFormat("#.##");

 public String formatD(double number) {

      return df.format(number);

 }



Double x = 1.0;


인 경우


String result = formatD(x);


이렇게 해주면


결과값은


"1" 로 찍힙니다.

신고
Posted by 그린블로그 DEV그린
2014.05.17 16:07


설계한 클래스를 혼자 사용하거나,

1회성으로 사용할 경우는 필요가 없습니다( 바람직하다고 생각지는 않지만 )

저는 private, protected 역시 const 와 쓰는 마찬가지인 이유로 쓴다고 생각합니다.

그런것들은 코드상에서 잠재적인 버그를 만들 수 있는 확률을 확실하게 줄여주며, 컴파일시에 잡을 수 있게 도와줍니다.


코드를 짤 때는 

"내가 만든 코드는 항상 누군가 보고 이용( 재활용 ) 될 수 있다 "

라는 생각을 갖고 해야합니다.


자신이 짠 코드를 이용하는 사람들이 항상 자신이 원하는대로

이용할 거라고 생각하지 마십시오.

자세한 메뉴얼도 도움이 되겠지만 해당 언어에서 제공하는

키워드를 이용하여 코드의 이용을 제한하는것이 효과적입니다.


그런면에서 private, protected, const 등등은 인터페이스, 자원 등을 단일화, 강제화 시킬 수 있으며 이러한 코딩 습관은 발생 가능 한 수 많은 버그의 경우의 수를 줄여 줍니다.


출처 : https://kldp.org/node/48605



[ class 의 경우 ]

public     : 모든 패키지에서 이 클래스를 참조할 수 있다.

private    : 자신을 포함한 클래스에서만 참조가능

protected : 자신을 포함하는 클래스에서 상속받은 클래스에서도 참조가능

default    : 동일 패키지 내에서 이 클래스를 참조할 수 있다.

 

[ 메소드의 경우 ]

public     : 이 클래스밖에서도 이 메소드를 참조할 수 있다.

private    : 이 클래스내에서만 참조가능

protected : 상속받은 클래스와 이 클래스내에서만 참조할 수 있다.

default    : 동일 패키지 내에서만 참조할 수 있다.



사실 private나 protected, default 접근자의 차이점은 제껴두고라도


코드를 짜면서 나는 정작 왜 이 접근자를 선언하고 있는가 생각할 때가 있었습니다.


어짜피 짜는거 걍 public이나 default로 통일하면 되는거 아니야? 라면서 말이죠.


윗글은 서핑하다 찾아낸 명답입니다. 


결과적으로 'private나 protected는 다른 코더를 위한 배려' 였다는 거죠 ^^



신고
Posted by 그린블로그 DEV그린
2012.01.11 13:17
java에서는 나머지 값을 구하는 산술연산자로 %를 사용하고 있습니다.

나머지 값을 구하는 형식은 다음과 같습니다.

int result = 10 % 5

여기서 10을 5로 나누면 나머지가 0이 되기 때문에

result의 값은 0이 됩니다.

하지만

int result = 9 % 5

와 같은 경우, 9를 5로 나누면 나머지가 4가 남기때문에

result의 값은 4가 되는 것입니다.



신고
Posted by 그린블로그 DEV그린
2011.09.29 12:36

4.2 생성자메서드

4.2.1 생성자메서드

생성자메서드란 클래스를 이용하여 메모리를 가진 instance 즉, 객체를 생성할 때 제일 먼저 호출되는 메서드입니다.

 

생성자메서드의 정의

n        객체를 생성과 동시에 기본적으로 호출 되어지는 메서드

 

여러분은 이미 생성자메서드를 사용하고 있었습니다. 생성자메서드를 여러분이 따로 만들지 않는다면 여러분이 만든 클래스에서 자동으로 디폴트생성자가 만들어지게 됩니다. 앞 절의 예제에서 우리는 다음과 같은 구문을 사용했습니다.

 

MainTest.java(디폴트 생성자메서드를 위한 예제)

public class MainTest{

             public void sayHello(){

                           System.out.println("Hello World!");

             }

 

             public static void main(String[] args){

                           MainTest m = new Ma inTest();

                           m.sayHello();

             }

}

MainTest()라는 메서드는 없습니다. 만들지도 않았죠. 이 때 여러분이 생성자메서드라하여 클래스의 이름과 같은 메서드를 만들지 않는다면 자바에서 기본적으로 디폴트 생성자라는 것이 만들어지는데 이 디폴트 생성자가 바로 MainTest()입니다. 메모리가 생성된 직후 가장 먼저 호출되는 메서드입니다. 물론 현재의 디폴트 생성자는 하는 일이 없습니다. 단지 생성자라고 표시만 할 뿐입니다.

 

, 클래스를 만들 때 사용자가 따로 생성자를 만들지 않는다면 매개변수가 없는 디폴트 생성자메서드 “MainTest()”가 만들어져서 사용되며, 디폴트 생성자메서드를 여러분이 약간 변형하여 만들거나 아니면 매개변수가 있는 생성자메서드를 다시 만든다면 기존의 디폴트 생성자메서드는 없어지고 새로운 생성자가 만들어지는 것입니다.

 

 

4.2.2 생성자메서드의 특징

  생성자메서드는 유일하게 리턴타입이 없는 메서드입니다. 그리고 생성자메서드의 이름은 클래스의 이름과 동일하며 일반적으로 초기화나 멤버의 기본값 할당을 위해 사용됩니다. 보통의 경우 클래스 작업을 할 때 제일 먼저 프로그램해야 하는 것들을 생성자메서드 내에 프로그램하게 됩니다.

 

생성자메서드의 특징

n        메서드의 리턴타입이 없다.

n        메서드의 이름은 클래스의 이름과 동일하다.

n        new생성자가 메모리를 생성한 직후 호출 되어진다.

 

생성자메서드는 new연산자와 함께 사용되는데 new연산자가 메모리를 생성하고 나면 멤버 변수들이 메모리를 할당 받게 됩니다. 멤버 변수들이 메모리가 존재하기 때문에 멤버필드에 값을 할당하거나 초기화를 할 수 있습니다. 이때 생성자 메서드가 활동을 하는 것입니다. 보통은 멤버필드의 초기화를 주로하지만 필요하다면 객체의 생성과 동시에 해 주어야 하는 작업들을 이 생성자메서드에서 하게 됩니다. 생성자가 없는 클래스에 대하여 컴파일러는 인수 리스트를 가지지 않는 생성자메서드를 자동으로 제공합니다. 이 생성자를 우리는 디폴트 생성자라고 부릅니다.

 

생성자의 역할은 초기화 작업이라고 했습니다. 생성자에 관련된 예제를 하나 만들어 보도록 하죠.

 

ConstructTest.java(생성자메서드를 위한 예제)

public class ConstructTest {

             private String name = null;

             private String address = null;

             private int age = 0;

             public ConstructTest(){

                           name = "이름없음";

                           address="주소없음";

                           age=0;

             }

             public void setList(String sname, String saddress, int sage){

                           name = sname;

                           address = saddress;

                           age = sage;

             }

             public String getList(){

                           String str = name + "  " + address + "   " + age;

                           return str;

             }

             public static void main(String[] args) {

                           ConstructTest ct = new ConstructTest();

                           String s;

                           s = ct.getList();

                           System.out.println(s);

 

                           ct.setList("홍길동", "서울시 중구", 25);

                           s = ct.getList();

                           System.out.println(s);

             }

}

C:\examples\4. Class for Basic Java>java ConstructTest

이름없음  주소없음   0

홍길동  서울시 중구   25

 

생성자메서드에서 값을 name, address, age 멤버필드에 할당하고 있습니다. 그렇기 때문에 객체를 생성한 직후 바로 getList멤버메서드를 호출 했을 때 생성자메서드에서 초기화 한 값을 얻을 수 있습니다. 다시 setList메서드를 통해서 값을 할당한 이후에는 바뀌겠죠. 이렇게 생성자에서 우선적으로 값을 할당해야 할 경우가 있다면 생성자메서드를 이용하면 아주 편하게 해결할 수 있습니다.

 

생성자메서드도 매개변수를 이용하여 외부로부터 직접 생성자메서드에 값을 할당하는 방법으로 멤버필드를 초기화 할 수 도 있습니다. 그 예를 살펴 보기로 하죠.

 

ConstructDirect.java(생성자메서드를 위한 예제)

public class ConstructDirect{

             private String name = null;

             private String address = null;

             private int age = 0;

             public ConstructDirect(String sname, String saddress, int sage){

                           name = sname;

                           address = saddress;

                           age = sage;

             }

             public void setList(String sname, String saddress, int sage){

                           name = sname;

                           address = saddress;

                           age = sage;

             }

             public String getList(){

                           String str = name + "  " + address + "   " + age;

                           return str;

             }

             public static void main(String[] args) {

                           ConstructDirect ct = new ConstructDirect("홍길동", "서울시 중구", 25);

                           String s;

                           s = ct.getList();

                           System.out.println(s);

             }

}

C:\examples\4. Class for Basic Java>javac ConstructDirect.java

 

C:\examples\4. Class for Basic Java>java ConstructDirect

홍길동  서울시 중구   25

 

우리는 이 예제에서 생성자에서 매개변수를 사용하는 방법을 쉽게 볼 수 있습니다. 만약 여러분이 이 예제처럼 매개변수가 있는 생성자메서드를 만들었다면 디폴트 생성자는 더 이상 사용할 수 없습니다. 그리고 반드시 생성자메서드를 사용될 때 매개변수의 개수와 형을 맞추어 주어야 합니다. 메서드는 매개변수의 개수와 매개변수의 형에 목숨을 걸고 있습니다. 그리고 생성자메서드에는 리턴타입이 없기 때문에 당연히 리턴이라는 것이 없습니다. 다른 일반 메서드 또한 리턴타입과 리턴값은 반드시 지켜야 합니다.

 

 

4.2.3 결론

 생성자메서드는 말 그대로 생성될 때 호출 되는 메서드입니다. 그 유용함은 객체 생성순간에 같이 호출 될 수 있다는 장점이 있습니다. 이 생성자를 아주 유용하게 사용하면 편리한점 뿐만 아니라 반드시 필요한 메서드입니다. 물론 그것은 아주 미세한 것이지만 이렇게 생각 해 볼 수 있습니다. 만약 인간이라는 데이터 타입으로 아기를 만든다고 생각 해 보십시오. 아기는 어느 정도 초기화는 되어 있어야 합니다. 눈, 코, 입, 팔, 다리등 필수적인 요소들은 전부 초기화 되어 있어야 합니다. 이러한 면에서 본다면 생성순간에 해 주어야 하는 일은 아주 중요한 일입니다. 만약 이것을 잘못하게 되면 아마 여러분들이 만든 객체는 이상한 괴짜 객체가 되고 말 것입니다.

 

출처 소설같은자바

신고
Posted by 그린블로그 DEV그린
2011.09.29 12:34

this 와 this() 는 다르구요, super와 super() 역시 다릅니다.


this 는 현재 클래스의 인스턴스, 그러니까 지금 실행상태에 있는 인스턴스의 특정 필드를 지정할때 사용합니다.



 class Test {


 int age;

 public void setAge(int age){

 this.age = age;

       }
 }



머 이렇다구 치구... 다른 객체에서 

Test test = new Test();

test.setAge(20);

이라고 하면 위에있는 setAge(int); 메소드가 작동을 하겠죠...

setAge(int age); 메소드를 보면 파라미터로 전달된 int 의 이름인 age와 Test 클래스의 필드값이 age가 같은 이름이거든요...

이럴때 this. 를 붙여주면 

this.age

는 "이 age는 지금 메소드(setAge)의 파라미터인 age 값이 아니라 클래스의 필드인 age다" 라는걸 나타냅니다. (헷갈리지 않게..)

그리고 두번째로는 뭐랄까... 강조하는 의미에서 사용하는 경우도 있습니다.

this.name = "용가리";

라고 하면 여기서 name 은 클래스의 필드라는것을 명확하게 나타냅니다. 위 문장이 메소드안에 존재하더라도 name 은 클래스의 필드임을 확실히 해두기 위해서 사용됩니다.


this(); 는 생성자를 부르기 위해서 사용되거든요..


 class Person{


 int age;
 String name;
 String address;

 public Person(){
 this(0, null, null);
 }

 public Person(int age){
 this(age, null, null);
 }

 public Person(int age, String name){
 this(age, name, null);
 }

 public Person(int age, String name, String address){
 this.age age;
 this.name name;
 this.addressaddress;
     }
 }


한사람에 대한 나이, 이름, 주소를 저장하는 클래스인데 생성자를 함 잘 살펴보세요.

점차 파라미터(넘겨받는 값)가 늘어나고 있죠...

다른 클래스에서

Person jane = new Person(23, "jane", "America");
Person jane = new Person(23, "jane");
Person jane = new Person(23);
Person jane = new Person();

위와같이 다양한 방법으로 인스턴스를 생성할 수 있도록 여러종류의 생성자를 마련했을때 this(); 가 유용하게 쓰일 수 있습니다.

생성자끼리도 서로가 서로를 호출할 수 있는(객체지향 프로그래밍에서는 메시지를 전달한다고 하는데 그냥 편하게 호출한다고 할께요..) 방법이 바로 this() 를 활용하는 겁니다. 

위에서 두번째, 세번째, 네번째 모두 결국은 첫번째 생성자

Person jane = new Person(23, "jane", "America");

를 호출해서 인스턴스를 만들거든요.... 뭐 이런식으로 쓰인다고만 아시면 되겠습니다.

같은 방식으로 super(); 는 현재 자식클래스가 자신을 생성할때 부모 클래스의 생성자를 불러서 함 초기화 해주고나서 자신을 초기화하는 것입니당.

class A extends B

라고 하면 클래스 B는 A의 부모 클래스죠.

A 를 생성한다고 하면 우선 B를 생성해야 합니다. 왜냐하면 A는 B를 상속하므로 A를 완전하게 만들려면 B부터 만들어야 하거든요. ^^;;(부모없이 자식이 존재할 수 없는것과 같습니다.)

class B{

public void setAge(int age)
{
...
}

}

class A extends B {

public void setAge(int age)
{
...
}

}

이렇다고 하면 

A a = new A();

로 인스턴스를 만들면 그냥 A 가 만들어지는게 아니라 

1. A 를 만들기 위해서 A의 생성자를 찾아간다.
2. 가서 보니까 A가 B를 확장하고 있네...
3. 그럼 B부터 만들어야겠군...
4. 그럼 B의 생성자를 찾아가야지..
5. B를 만들었으니..
6. 이제 A를 만들자.
7. 다 만들었다!!!

이렇게 됩니다. ^^;;

위에서 클래스 B를 

class B{

public B (int a){
;
}
}

로 하믄 어떤일이 벌어질까요..

에러가 발생합니다. 왜냐하면 3번에서부터 문제가 발생합니다.

3. 그럼 B부터 만들어야겠군...
4. 그럼 B의 생성자를 찾아가야지..
5. 헉! 알맞는 B의 생성자가 없다
6. 에러다!

왜 없다고 하나면 A 클래스에 대한 생성자가 없으니까 디폴트로

public A() { ; }

와같이 생성자를 만듭니다.

그런데 B에서는 int 값을 전달받는 생성자를 명시적으로 적어줬으니 

public B() { ; }

이런 생성자가 없게 됩니다.(필요하다면 적어줘야함)

A 가 B 를 상속하니까 B를 만들어야 되는데 A의 생성자에서 명시적으로 B의 생성자를 적어주지 않았으므로 역시 디폴트로 

super();

를 부릅니다. super(); 를 부른다는 것은 부모 클래스의 

public B(){;}

를 실행하라는 말입니다. 그런데 저런 생성자가 없으니 에러가 납니다.

이럴때는 A에서 

class A extends B {

public A(){
super(20);
}

}

요렇게 부모 클래스의 생성자를 불러주면 잘 작동합니당. ^^;;;

이게 바로 super(); 의 쓰임새입니당..^^;;


super는 뻔하겠죠. 부모클래스의 필드값이나 메소드를 직접 부를 때 붙여넣는 겁니다.

위에서 A나 B나 둘다 모두 setAge(int); 메소드가 있습니다. 자식 클래스인 B에서 부모클래스 A의 setAge(int); 메소드를 부를 일이 생겼다고 치죠. B에서 그냥

setAge(20);

을 부르면 B 클래스에 있는 메소드를 부르게 됩니다. B 클래스에 setAge(int) 메소드가 없었다면 부모 클래스에 있는지 자동으로 찾아보게 됩니다.

하지만 B에는 setAge(int) 가 있으므로 부모 클래스의 setAge(int) 를 찾지 않고 B의 메소드를 사용하게 됩니다.

우리가 원하는 것은 부모클래스의 setAge(20) 을 부르고 싶기 때문에

super.setAge(20);

을 해야 합니다. super 는 "나에게 있는 메소드나 필드를 찾지 말고 내 부모 클래스에 있는 필드나 메소드를 사용해라" 라는 의미로 붙여주는 예약어입니다.




 
수타~면~
신고
Posted by 그린블로그 DEV그린
2011.09.29 12:34

객체(Object)는 정말 설명드리기 어려운 컨셉입니다.

종류(Class)가 있으면 그 종류를 실체화(Instanciate) 시킨게 객체입니다.

터무니없는 비유지만 Class가 인간이라면 질문자분께서는 인간이라는 Class의 객체에 가깝습니다.

 

메소드(Method)는 실체화된 객체 Object가 할 수 있는 일련의 행위입니다.

객체는 특정한 메소드를 불러서 실행할 수 있습니다. 예를 들어 각각의 'countNumber'라는 이름의

메소드가 있고 'student' 라는 객체가 있으면 student는 무언가를 하기 위해 student.countNumber()

같은식으로 메소드를 콜(Call) 할 수 있습니다.

 

변수(Variable)은 수학의 그것과 매우 비슷합니다.

가장 많이 쓰이는 변수의 종류(Class)로는 String, Integer, Character 등이 있습니다.

이러한 변수들은 프로그래머가 어떻게 정의하느냐에 따라 특정한 값을 가질 수 있습니다. 예를들어

'x' 라는 변수가 있고 그 종류가 integer(정수)라면 int x = 3  이런식으로 x를 3이라고 정의하실 수 있습니다.

물론 '변수'는 변수이므로 나중에 얼마든지 그 값을 바꾸실 수 있습니다.

(이 부분은 제가 한국어로 배우지않아 확실치 않은데 제가 위에 언급한 string, integer, character, double 등을

포함한 몇가지 primitive type을 variable이라 부르고 나머지 Class로부터 Instanciate가 가능한 것들을

객체라고 부르는것 같습니다. primitive type은 자바 안에 특별히 정의되어 기타 실체화가 가능한 다른 종류들과

값을 저장하는 법이 틀립니다. 이 부분은 민감한 부분이므로 나중에 자세히 배우시길 권합니다.)

 

키워드, 식별자는 중요하지 않으므로 패스하고, 가비지컬렉션은.. 프로그램을 실행할때 종종 객체가 메모리에서 삭제되지 않고 남겨지는 경우가 있는데 그럴경우 자바에서 자체적으로 남겨진 객체를 삭제하는 기능을 말합니다. 아주 간단하게는 그냥 프로그램이 메모리를 효율적으로 사용하는걸 돕기위해 자바에서 자체적으로 실행하는

기능이라고 생각하시면 될 것 같습니다. 예를 꼭 들자면....질문자님께서 푸딩을 드시다가 그만먹고 아이스크림을

드시면 자바라는 청소부(garbage collector)가 푸딩을 알아서 가져다 버려주는걸 가비지컬렉션이라고 합니다.

 

스택(Stack)은 정보를 정리하는 방법 중의 하나입니다.

스택을 구체화하자면, '위가 열려있는 통'으로 으로 생각하시면 됩니다. 밑이 막혀있기때문에

정보를 위에서부터 밑으로 하나씩 집어넣으면서 쌓고 꺼낼때는 위에서부터만 하나씩 꺼낼 수 있겠지요.

이런 구조는 웹브라우저에서 방문했던 사이트들을 기억할때에도 사용됩니다.

예를들어 질문자분께서 네이버.com에 가셨다가 hotmail.com에 가셨다가 bugs.co.kr에 가셨다가 뒤로가기

버튼을 눌러서 주소창에 http://www.naver.com라는 주소를  치지 않고도 네이버로 돌아가실 수 있는 이유는

웹브라우저가 실행되는동안 질문자분께서 방문하신 사이트의 주소를 밑의 그림처럼 저장해놓기 때문입니다.

     

    |                                 |                    |                                |                     |                               |

    |   www.bugs.co.kr    |                     |                                |                    |                               |

    | -----------------  |   뒤로가기    |                                |   뒤로가기     |                               |

    |   www.hotmail.com  |    ----->      |   www.hotmail.com  |   ------>      |                               |

    | -----------------  |                    | -----------------  |                    |                               |

    |    www.naver.com    |                    |    www.naver.com   |                    |    www.naver.com   |

    | -----------------  |                    | -----------------  |                    | ----------------- |

 

스택과 비슷한 것으로는 큐(Queue) 가 있습니다.

큐(Queue) 간단하게 한쪽에서 들어와서 반대쪽으로 나갈 수 있는 구조라고 생각하시면 됩니다.

자주쓰이는 예제로는 입구쪽으로 들어와서 계산을하고 출구로 나가는 손님들이 있습니다.

 

                       ------------->-------------->--------------->

 입구  --->       손님1    |    손님2   |    손님3   |   손님4   |  손님5---->  출구

                       ------------->-------------->--------------->

 

 

어느쪽이 입구고 어느쪽이 출구인지는 중요하지 않습니다. 실제로 큐를 Implement할때 좌로하던 우로하던

아무런 상관이 없습니다. 큐를 사용하는 사람은 들어오고 나가는 방향에 아무런 상관없이 사용할 수 있습니다.

큐는 스택과는 달리 들어온 쪽으론 나가지 못한다는 것이 중요합니다. 이는 프린터에 들어오는 출력 요청을

처리할때도 쓰입니다. 들어온 차례대로 인쇄가 되어야지 뒤에 들어온 출력요청이 뒤로 먼저 나가서는 안되겠죠.

 

 

출처 : 지식인 augustusminu

신고
Posted by 그린블로그 DEV그린
2011.09.29 12:33

연산자

구분연산자사용예설명
산술연산자 + a + b 덧셈
- a - b 뺄셈
* a * b 곱셈
/ a / b 나눗셈
% a % b 나머지
++ ++a 연산전에 변수값 1증가
a++ 연산후에 변수값 1증가
-- --a 연산전에 변수값 1감소
a-- 연산후에 변수값 1감소
관계연산자 > a > b a 가 b 보다 크면 true
>= a >= b a 가 b 보다 크거나 같으면 true
< a < b a 가 b 보다 작으면 true
<= a <= b a 가 b 보다 작거나 같으면 true
== a == b a 가 b 와 같으면 true
!= a != b a 가 b 와 같지 않으면 true
논리연산자 && a && b a, b 모두 true 이면 true
|| a || b a,b 둘 중 하나라도 true 이면 true
! !a a 가 true 이면 false, false 이면 true
대입연산자 = a = 9; 변수 a 에 값 9 를 할당
+= a += b; a = a + b;
-= a -= b; a = a - b;
*= a *= b; a = a * b;
/= a /= b; a = a / b;
%= a %= b; a = a % b;
조건연산자 max = a > b ? a : b; a 가 b 보다 크면 a의 값을 max 에 할당
a 가 b 보다 크지 않다면 b의 값을 max 에 할당


신고
Posted by 그린블로그 DEV그린