2016-03-31

14. java - StringBuilder & StringBuffer 클래스

* StringBuilder / StringBuffer
  - 변경이 가능한 문자열을 표현하기 위한 클래스
  - 두 클래스의 인스턴스는 문자열이 아님!


StringBuilder


- 문자열 저장, 수정을 위한 메모리 공간(버퍼)를 가지고 있으며 이 크기는 자동 조절됨
* 크기 조절하기 위해 사용되는 대표적 생성자   
   ( ... 되도록 버퍼 크기를 미리 할당해 놓는 것이 효율적이다)

1) public StringBuilder() 
    : 16개 문자 저장 버퍼 생성, 추가적인 문자 저장에 따라 크기 자동 증가

2) public StringBuilder(int n)
    : 넘겨받은 수(n)만큼 문자 저장 버퍼 생성

3) public StringBuilder(String str)
    : 넘겨받은 문자열의 길이 + 16 개 문자 저장 버퍼 생성

 * 중요한 메소드
  1) append : 넘겨받은 값을 StringBuilder의 인스턴스 내의 문자열 끝에 문자 형태로 추가
  2) insert : 첫번째 매개변수는 인스턴스 내의 문자열에서의 위치(0부터 시작)
               두번째 매개변수는 문자 형태로 저장하려는 데이터 

ex)
public class ExStringBuilder
{
    public static void main(String[] args) 
    {
        StringBuilder strBuf1 = new StringBuilder("AAA");
        strBuf1.append("BBB");
        strBuf1.append(22);
        strBuf1.append('!');
        System.out.println(strBuf1);  //AAABBB22! 출력
        
        StringBuilder strBuf2 = new StringBuilder("ABCDEF");
        strBuf2.insert(1"MM");
        System.out.println(strBuf2);  //AMMBCDEF 출력
        strBuf2.insert(522);
        System.out.println(strBuf2);  //AMMBC22DEF 출력
    }
}



StringBuffer ... StringBuilder 클래스와 거의 동일
  1) 메소드 수(+생성자)  2) 메소드 기능  3) 메소드 이름과 매개변수 가 동일

* 차이 : StringBuffer는 Thread에 안전 
           StringBuilder는 Thread에 안전하지 못함


           

13. java - String 클래스

String 클래스

 - String 인스턴스 생성시 " " 만으로도 생성 가능         
ex)
String str = "Hello";










 - String 인스턴스는 상수 형태 = 데이터 변경이 불가
    why?
    : 같은 문자열일 경우 공유가 되므로 어느 한 쪽이 마음대로 데이터를 변경한다면 문제가 발생하기 때문 

 -문자열이 동일할 경우 하나의 String 인스턴스만 생성 후 그것을 공유
    why?  
    : 인스턴스의 생성은 시스템에 부담을 줌, 문자열을 표현할 때 마다 인스턴스가 생성된다면 부담증가 
       생성횟수를 최소화 하기위해 같은 문자열은 공유
  
 ex)
String str1 = "Hello";
String str2 = "Hello";
















* API 문서를 잘 참고하는게 중요! 


* 유용한 메소드

1) 문자열 길이 반환(+ 공백포함)
    : public int length() 
ex)
String str = "Hello";
System.out.println(str.length()); //5출력

    

2) 두 문자열 결합
    : public String concat(String str)
 ex)
String str1 = "Hello";
String str2 = "World!";
System.out.println(str1.concat(str2)); //HelloWorld! 출력



3) 두 문자열 비교
    : public int compareTo(String str)
    * 반환 값에 따라 
          0 : 두 문자열은 동일
      음수 : 메소드를 호출한 String 인스턴스의 사전상 순서가 앞서있다
      양수 : 전달된 String 인스턴스의 사전상 순서가 앞서있다
 ex)
String str1 = "Hello";
String str2 = "World!";
System.out.println(str1.compareTo(str2)); //-15 출력



* 문자열 복사
ex) 
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String(str1);
        
if(str1==str2)
    System.out.println("같다");
else
    System.out.println("다르다");
        
if(str1==str3)
    System.out.println("같다");
else
    System.out.println("다르다");


  
  -> 세개의 String 인스턴스의 데이터 값이 모두 같으니 하나의 공간을 공유할 것 같지만 아님!


 - str1 의 데이터가 복사되어  별도의 String 인스턴스가 생성됨!


















2016-03-30

12. java - 메소드 오버로딩

메소드 오버로딩(method overloading)

 - 메소드의 이름은 동일하지만 매개변수의 갯수 , 데이터 타입이 다름

 - 반환형만 다른 것은 X
    why? 메소드 호출시 혼란 발생
ex)        
    int add (int a, int b);
double add (int a, int b);
//메소드 호출시 메소드명과 매개변수로 호출이 이루어 지기 때문에 어떤 것을 호출해야하는지 혼란



* 생성자도 메소드 오버로딩
  => 생성자도 오버로딩을 통해 하나의 클래스에서도 다양한 형태의 인스턴스를 생성 가능
ex)
class Phone
{
    int telephone;
    int cellphone;
    public Phone(int tel, int cell)
    {
        telephone = tel;
        cellphone = cell;
    }
    public Phone(int cell)
    {
        telephone = null;
        cellphone = cell;
    }
}
class ExOverloding 
{
    public static void main(String[] args) 
    {
        Phone p1 = new Phone("02-123-4567","010-1234-5678");
        Phone p2 = new Phone("010-1111-2222");
    }
}


   p1과 p2는 같은 클래스의 인스턴스 이지만 다른 형태로 생성


2016-03-28

11. java - static

static 변수 

class AAA{
    static int num=0;
    public AAA(){
        num++;
    }
}
class MainClass{
    public static void main(String[] args){
        AAA a1 = new AAA();
        AAA a2 = new AAA();
        AAA a3 = new AAA();
    }
}


 

한 클래스의 모든 인스턴스가 공유하는 변수                           
- 메모리 공간에 하나만 존재
* 언제 사용? 
   : 인스턴스간의 데이터 공유가 필요한 경우

* 접근 방법 

   1) 인스턴스의 이름으로
   2) 해당 클래스의 이름으로 
    ... 1) 의 경우 인스턴스 변수 접근 방법과 구분 되지 않기 때문에 2)로 접근

* 초기화 

    : JVM에 의해 클래스가 메모리 공간에 올라가는 순간
      (java 는 필요한 만큼만 메모리 공간에 올려 사용!!)  


static 메소드

 - 클래스의 모든 인스턴스가 호출 가능
 - 인스턴스를 생성하지 않아도 호출 가능
 - 인스턴스 변수에 접근 불가 ... 해당 클래스의 인스턴스가 모두 공유하는 메소드 이기 때문
    
 * 언제 사용?
    : 인스턴스 변수를 이용하지 않아도 되는 일인 경우, 기능만 제공하는 경우!


2016-03-21

java 파일에서 public 클래스가 하나만 있어야하는 이유는?


 - 소스를 찾기 쉽게 하기 위해 
 - 이런 제약을 둠으로써 실수할 수 있는 부분을 줄이고 효율을 높이기 위해 





MVC?

MVC, Model-View-Controller
 : 비즈니스 로직 / 프리젠테이션 로직을 분리해 웹 어플리케이션을 개발하는 디자인패턴

 - Model : 데이터

 - View : 화면
 - Controller : Model 과 View의 중간 역할


* MVC 모델1 

  : View 와 Controller 가 JSP 페이지 하나에서 처리 됨
  장) 구조가 단순, 쉽게 구현 가능
  단) JSP 코드가 복잡해져 유지보수 어려움, 분업이 힘듬, 
  --비교적 작고 업데이트 적은 곳에서 


* MVC 모델 2

 : 모델 1의 단점을 보완 
  장) View 와 Controller를 분리했기 때문에 코드가 덜 복잡 --> 유지보수에 용이
  단) 다루기 어렵다
  -- 큰 프로젝트!

 상황에 따라 적절한 방식을 선택!



2016-03-18

10. java - 접근제어 지시자

객체지향 언어는 캡슐화가 중요!
캡슐화 : 관련있는 변수, 메소드를 하나의 클래스안에 묶는 것
            - 내부의 정보를 아무나 볼 수 없게 만든다.
              각 상황에 맞는 접근 허용 범위를 지정해야함.
         

접근 제어 지시자 


- 접근 허용범위  ... 클래스를 기준으로 결정













1) private : 클래스 내부 멤버끼리만 접근이 가능

ex)
class AAA
{
    private count;
    
    ...
}
class BBB
{
    public void countAAA(AAA a)
    {
        a.count = 2;    
    }
}


 클래스 BBB의 countAAA메소드에서 AAA클래스의 변수에 접근하지 못함.

 접근하려는 변수가 private 로 선언되었기 때문에 외부의 클래스는 접근이 허용되지 않음


2) default

ex)
package fruit;
class AAA
{
   ...   
}
//다른 패키지
package animal;
class BBB
{
   public void create()
   {
      fruit.AAA a = new fruit.AAA();
   }
}
cs
AAA는 디폴트로 선언된 클래스 이기 때문에 같은 패키지의 클래스만 AAA에 접근이 가능


3) protected

ex)
class AAA
{
   protected int num;
}
class BBB extends AAA
{
   public void countAAA(int n)
   {
        num = n;  
   }
}


BBB는 AAA를 상속받음, AAA내의 num변수는 protected로 지정   

-- BBB에서 AAA의 num에 접근이 가능


4) public

ex)
//각각 따로 존재하는 파일
package fruit;
public class AAA
{   
    ...  
}
package animal;
public class BBB
{   
    public void create() 
    { 
         fruit.AAA a = new fruit.AAA();  
    }
}


AAA클래스가 public으로 지정되어 있기 때문에 외부 클래스가 접근이 가능.


*클래스를 public으로 선언 시 주의

  - 하나의 소스 파일에는 하나의 public클래스만 존재
  - public 클래스와 해당 소스 파일의 이름은 일치해야 함
    

* 자동으로 생성되는 디폴트 생성자의 경우

   ~ 해당 클래스의 접근제어 지시자에 따라 default인지 public인지 달라진다.

* 모든 기능을 하나의 클래스에 넣기 보다는 작게 디자인한다.

  why? - 변경 범위를 최소화 시키기 위해
           - 만들어놓은 클래스를 다른 곳에서도 이용이 가능하게 하기위해


9. java - package

package 
 - 클래스 파일이 저장되어 있는 디렉토리 정보를 표시해서 인스턴스 생성하기 위해 사용
 - 소스 파일에 별도의 선언이 필요 + 디렉토리도 잘 나누어야 함


* 패키지 선언
    package 패키지 명;

ex) 다른 디렉토리에 있지만 이름이 동일한 클래스가 있는경우 













이 경우 각각의 Circle 인스턴스를 생성하려면 먼저 소스파일에 패키지 선언을 하고 생성을 해야한다.


(AAA의 Circle.java)

//소스파일의 위에 패키지 선언을 한다.
//해당 클래스는 pack.AAA 라는 패키지에 묶인다.
package pack.AAA; 
class Circle
{
    int r;
    public Circle(int rad)
    {
        r = rad;
    }
}



(BBB의 Circle.java)
//해당 클래스는 pack.BBB 라는 패키지에 묶인다.
package pack.BBB; 
class Circle
{
    int r;
    public Circle(int rad)
    {
        r = rad;
    }
}



//각 Circle 인스턴스 생성시
pack.AAA.Circle c1 = new pack.AAA.Circle(10);
pack.BBB.Circle c2 = new pack.BBB.Circle(20);


패키지 이름은 pack.AAA와 pack.BBB이고 이것을 찾기 위해 C: 가 클래스패스에 포함되어 있어야 한다. 

* 클래스 이름, 패키지 이름은 클래스 패스를 기준으로 찾는다.
* 클래스는 반드시 하나의 패키지에 포함 되어야 하는데 별도의 선언이 없는 경우 이름없는 패키지로 묶인다  
    --- why? 클래스의 접근허용 범위 때문에 


- import 

 패키지에 포함되어 있는 인스턴스 생성시 불편... 
 import를 사용하여 미리 소스 파일의 앞에 선언해준다.
import pack.AAA.Circle;
Circle c1 = new Circle(10);


더 간단히 인스턴스를 생성할 수 있게 됨. 


단, 클래스의 이름이 겹치는 경우는 모호함이 발생할 수 있기 때문에 잘 보고 사용한다.

import pack.AAA.Circle;
import pack.BBB.Circle; 
//각 인스턴스가 어느 패키지의 인스턴스인지 구분할 수 없음
Circle c1 = new Circle(10);
Circle c2 = new Circle(20);


 -- 이런경우는 X



2016-03-16

8. java - class path

Class Path : 클래스파일이 존재하는 경로


ex)
ClassPath.java 
 :클래스 AAA, BBB, ClassPath가 있다.
 컴파일을 하게 되면 세개의 클래스 파일이 생성 된다. 
class AAA{
    public void printName(){
        System.out.println("AAA");
    }
}
class BBB{
    public void printName(){
        System.out.println("BBB");
    }
}
class ClassPath{
    public static void main(String arg[]){
        AAA aaa = new AAA();
        aaa.printName();
        BBB bbb = new BBB();
        bbb.printName();
    }
}













생성된 클래스 파일 AAA.class와 BBB.class를 subclass 라는 하위 폴더에 넣고 ClassPath를 실행하면 실행되지 않는다.

why? 실행에 필요한 두 클래스 파일을 찾지 못하기 때문이다.

이 때 클래스경로를 설정해 주어야 한다.





명령 프롬포트 창에서 set 명령어를 이용해 classpath를 설정해준다.
. 은 현재 위치
.\subclass 는 subclass라는 폴더까지 포함한다는 뜻이다.
이렇게 classpath를 설정해주면 설정된 경로에 가서 클래스 파일을 탐색하게 된다.


2016-03-08

7. java - 클래스, 객체

7.1 클래스와 객체
  










  - 클래스(class) : 객체를 만들기 위한 틀
  - 객   체(instance) : 상태(데이터/변수)나 행동(기능/메소드)을 보유한 것 
  
    클래스는 틀일 뿐 아직 객체가 아니다 = 메모리에 공간 할당되지 않음 = 객체 접근/호출 불가
    클래스를 이용해 객체가 생성 = 메모리에 공간이 할당됨 = 객체 접근/호출 가능

  * 클래스 이름 규칙 
     : 첫 문자는 대문자
       여러 단어가 결합된 이름의 경우 새로운 단어의 첫 문자는 대문자 
       ex) RectangleDrawer
    
  * 객체 변수, 메소드 이름 규칙
      : 첫 문자는 소문자
        여러 단어가 결합된 이름의 경우 새로운 단어의 첫 문자는 대문자
        ex) int numOfRectangle;
               void setHeight(){ ... }


7.2 객체 생성방법 





 ① 참조할 객체의 클래스 이름을 쓴다
 ② 참조변수의 이름으로 해당 객체에 접근
 ③ 객체를 생성하는 키워드
 ④ 객체 생성시 한 번만 실행, 초기화 작업을 해줌


 * 참조 변수
     - 객체를 참조하기 위한 변수
     - 해당 객체가 있는 메모리의 주소값을 갖는다.
                
 * 생성자 
      - 클래스의 이름과 같아야 함
      - 반환형이 없다
     1) 디폴트 생성자 : 컴파일러가 자동으로 삽입해주는 생성자
     2) 사용자가 정의한 생성자 
     ( * 사용자가 새로 만든 생성자만을 정의하면 디폴트 생성자를 사용하지 못한다
          -- 이때는 컴파일러가 자동으로 삽입을 해주지 않는다.)


ex)
1. 클래스 정의

 2.객체 생성








r1: 디폴트 생성자를 통해 생성       - width=20, height=30의 값을 갖는다.
r2: 새로 정의한 생성자를 통해 생성 - width=40, height=50의 값을 갖는다.
(*사용하는 생성자에 맞게 매개변수의 타입 갯수를 잘 맞춰줘야 함)


7.3 객체 접근 방법




  객체의 변수에 접근하거나, 메소드를 호출시 . 을 이용한다
  ex) r.width;
        r.height;
        r.getWidth(); ...