레이블이 java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 java인 게시물을 표시합니다. 모든 게시물 표시

2017-03-05

ERROR: Registry Key 'Software\JavaSoft\Java Runtime Environment'\CurrentVersion' has value '1.8', but '1.7' is required.











원인 : 다수의 JAVA 버전이 설치 되어 있어서!!! 

해결
 1. 윈도우 키 + R - "regedit" 실행
 2. HKEY_LOCAL_MACHINE - SOFTWARE - JavaSoft - Java Runtime Environment
 3. CurrentValue 사용할 자바 버전으로 값 수정























다시 version을 보면




2016-04-14

18. java - for-each 문

for-each 문 
 : 배열에 저장되어 있는 모든 값을 참조할 때 사용
 : for문을 사용할 때 보다 더욱 간결하게 사용가능


- 구조
배열의 요소를 지칭하는 변수
반복할 배열
각 요소를 참조하여 무엇을 할 것인지





* 배열 요소를 지칭하는 변수와 반복할 배열의 데이터 타입은 같아야 함!!

* for-each 문 내에서 요소(e)의 값을 변경시켜도 해당 for-each문 내에서만 의미가 있음
   ... 배열 요소를 변경시켜야 한다면  for-each는 사용x 


ex)

int []arr = {1,2,3,4,5};

for(int e : arr){

    System.out.println(e);
}


(실행결과) ... 요소를 모두 출력








* 인스턴스 배열의 경우

  ... 배열에 저장되어 있는 인스턴스의 참조 값이 변경이 불가한것
     참조 값을 통한 인스턴스 변수의 변경은 가능하다.

ex)

public class Number {

    public int num;

    public Number(int n){

        this.num = n;
    }

    public int getNum(){

        return num;
    }
}

class ExMain{

    public static void main(String []args){

        Number []arr = new Number[3];

        arr[0= new Number(1);

        arr[1= new Number(2);

        arr[2= new Number(3);

        
        System.out.println("참조하는 인스턴스의 변수를 1증가후 출력");

        for(Number e : arr)

            e.num++;

        for(Number e : arr)

            System.out.print(e.getNum() + " ");
    

        System.out.println("\n배열의 요소 변경 후 출력");

        for(Number e : arr){

            e = new Number(11);

            e.num++;

            System.out.print(e.getNum() + " ");
        }

        
        System.out.println("\n참조 값의 인스턴스 변수 재 출력");

        for(Number e : arr)

            System.out.print(e.getNum() + " ");
    }
}



(실행결과)










+ 배열 참조 값을 바꾸어도 해당 for-each문 내에서만 바뀐다.

+ 배열 요소가 참조하는 인스턴스 변수는 변경이 된다.  



2016-04-10

17. java - 배열

- 배열로 선언된 변수는 반복문을 통해 동일한 코드 패턴을 적용할 수 있음.
- 다양한 자료형, 클래스를 기반으로 선언 가능
- 배열의 시작은 0번 부터
- 배열도 인스턴스! - 인스턴스 변수와 메소드가 있다!

1) 1차원 배열
- 선언
   타입 []참조변수; 
ex)

int []arr;


- 생성

   new 키워드를 이용하여 저장할 공간을 할당
 ex)
arr = new int[3]; //int 형을 저장할 3개의 공간이 생성












- 접근 방법
 : 참조 변수와 배열의 인덱스를 이용하여 각 요소에 접근할 수 있다.

int []arr = new int[3];
arr[0= 11;
arr[1= 22;
arr[2= 33;




- 선언 + 초기화 방법
int []arr = new int[2] {1,2};

 : 생성과 동시에 크기, 배열 요소를 지정

int []arr = new int[] {1,2};

 : 크기를 지정하지 않아도 지정된 요소대로 자동 할당 됨

int []arr = {1,2};

 : 요소만 지정해주어도 됨



*배열의 길이
  참조변수.length()

*객체 배열

: 배열의 각 요소에는 해당 객체를 참조하는 참조변수가 저장됨.

ex)

String []arr = new String[];
arr[0= "Apple";
arr[1= "Banana";
arr[2= "Grape";

















2) 2차원 배열
 : 둘 이상의 1차원 배열을 묶어서 선언

- 생성 방법

ex)
int [][]arr = new int [2][2]; // 2행 2열 배열 선언












- 접근 방법

ex)
int [][]arr = new int [2][2];
arr[0][0= 1;
arr[0][1= 2;
arr[1][0= 3;
arr[1][1= 4;



- 선언 + 초기화 방법


int [][]arr = new int[][] {{1,2},{3,4}};



int [][]arr = {{1,2},{3,4}};



int [][]arr = {{1},{2,3},{4,5,6}};












이런 형태로 생성됨


* 행의 크기만 명시하는 방식으로도 선언 가능

int [][]arr = new int[3][];
arr[0= new int[2];
arr[1= new int[3];
arr[2= new int[4]; 





2016-04-05

16. java - 콘솔 입력(Scanner)

자바에서 사용자에게 입력을 받기 위해서는 scanner 클래스를 사용한다.


Scanner 클래스

 - 생성자에 전달되는 데이터를 추출하는 기능을 하기닫기 위한 클래스
    ... 키보드 입력 뿐 아니라 다양한 데이터에 이용!
 - java.util.Scanner 를 import 해야 사용가능

* 주요 메소드 
   : 입력받아야 하는 데이터의 타입에 따라 사용
   : 데이터 구분의 기준은 공백이다(스페이스 바, 엔터, 탭)

  - public boolean nextBoolean();

  - public byte nextByte();

  - public short nextShort();

  - public int nextInt();

  - public long nextLong();

  - public float nextFloat();

  - public double nextDouble();

  - public String nextLine();
  
ex)
import java.util.Scanner;
class ExScanner
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        System.out.println("a: " + a);
    
        String b = sc.nextLine();
        System.out.println("b: " + b);    
    }
}


결과

 ... 이상한 결과가 나옴, b는 입력의 기회도 없이 출력되버림 
why? 
 : a를 입력받을 때 데이터 구분을 위해 사용되었던 공백이 nextLine 메소드에 의해 읽혀져서 b에 들어갔기 때문! 

그래서 
import java.util.Scanner;
class ExScanner
{
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        System.out.println("a: " + a);
    
        sc.nextLine();  //공백을 읽어준다.
        String b = sc.nextLine();
        System.out.println("b: " + b);    
    }
}


b를 입력받기 전 nextLine() 메소드를 사용하여 공백을 제거해준다.

(결과)





올바른 실행 결과가 나옴!!



15. java - 콘솔 출력


* 메소드
1) System.out.print(" ... ");  
    : 문자열 출력 이후 개행 처리 X

2) System.out.println(" ... ");
    : 문자열 출력 이후 개행 처리

3) System.out.printf(" ... ", %d, %s ...);
    : 문자열과 내용을 조합하여 출력, 개행 처리 X 

ex)
class ExOutput
{
    public static void main(String[] args)
    {
        System.out.print("print 메소드 실행");
        System.out.print("\n개행 처리를 따로 해주어야 함\n");
        System.out.println("println 메소드 실행");
        int a = 1;
        double b = 2.2;
        String c = "this is string";
        System.out.printf("a: %d, b: %f, c: %s", a,b,c);
    }
}


(결과)






* Escape Sequence(이스케이프 시퀀스) ... 문자열 안에서 다른 의미로 해석됨
   1) \n : 개행(줄바꿈)
   2) \t  : 탭
   3) \"  : 큰 따옴표
   4) \\ : 역슬래쉬 

ex)
class ExEscapeSe
{
    public static void main(String[] args)
    {
        System.out.println("\n : 개행");
        System.out.println("\t : 탭");
        System.out.println("\" : 큰 따옴표");
        System.out.println("\\ : 역 슬래쉬");
    }
}


(결과)








2016-04-01

문자열에서의 + 연산


 문자열에서 + 연산은 컴파일러의 적절한 메소드 호출을 통해 이루어진다.

ex)
String str = "Hello" + '!';


이런 형태로 연산이 됨
String str = "Hello".concat(String.valueOf('!'));


 -> 1) valueOf 메소드를 이용해 전달된 데이터를 String 인스턴스로 변환 
     2) concat 메소드로 결합
     ...+ 연산이라고 무작정 concat 메소드부터 호출되는 것이 아니다!


+ 연산이 많이 이루어질 경우 String 인스턴스 생성 횟수가 너무 많아지는것 아닌가??? 

 => 문자열 결합 최적화를 통해 해결 ... String 인스턴스를 최대 2개만 생성해도 가능!
       ... StringBuilder 이용

ex)
주어진 문자열 
String str = 11 + "Hello" + 22;


이렇게 변환됨
String str = new StringBuilder().append(11).append("Hello").append(22).toString();


(진행과정)






① StringBuilder 인스턴스가 생성
② append 메소드로 11을 문자형 데이터로 추가
③ Hello 추가
④ 22 추가
⑤ StringBuilder 인스턴스를 String 인스턴스로 만들기 위해 toString메소드 사용
    toString 메소드 내부에서 만들어진 String인스턴스(1개) 를 str 로 참조값 반환하며
    String 인스턴스 str(2개)  생성

 => 이렇게 String 인스턴스를 최대 2개만 생성하고도 가능하다!



2016-03-31

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 인스턴스가 생성됨!