독개

JAVA 기초

by #독개#

JAVA



수업은 Eclipse에서 진행한다.

Cntrl+Shif+f : 자동정렬 (좋을때도 있고 안좋을때도있다 예를들어 자기스타일대로 정리하는사람에겐 안좋음)


Java에서 문자열출력

1. System.out.println("Hello~ World");

   System.out.println(변수);

   sysout 치고 Cntrl+스페이스 하면 이클립스에서 자동으로 쳐준다.

   println은 자동개행


2. System.out.printf("%d %c Hellow world \n", 변수a,변수b);

   printf는 C언어와 같다. 자동개행없고, 포멧인자형식



변수

  • 프로그램에서 사용되는 데이터가 저장되는 공간
  • 데이터가 변할 수 있는 저장공간
  • 사용되기 이전에 선언되어야만 함

상수

  • 프로그램에서 사용되는 데이터가 저장되는 공간
  • 변수에 한번 저장된 데이터는 변경 불가능
  • 선언과 동시에 반드시 초기화
  • final키워드를 사용하여 선언함 (c언어에서는 const 자바에선 final 이름만다르다)

기본자료형

자바에선 자료형이 C언어 만큼 중요치는 않다 (메모리에 대해서 자동으로 알아서 관리해주기때문에)

C언어와 다른점

Char 문자 2byte (C언어 1byte)
boolean true/false 1byte
byte 정수 1byte

ex) boolean a = true ; (C언어에선 0은 거짓 나머지값들은 참 but 자바에선 ture/false로만 구분)


변수선언

예약어들 (for,int,null,return,class,try,void 등등 안됨)

공백안됨 ex) str 1234 (x)


String



name1 == name3 //false : 각각 들어있는 값(주소)가 다르기 때문이지

String에서 문자열을 비교할때는 name1.equals(name3) 이런식으로 쓴다

new를 하면 무조건 새로운 객체가 만들어진다

String name = "신용권"          ==  String name = new String("신용권")

 

String str1 = "hacker" ;

String str2 = "i2sec" ;

String str3 = "4444" ;


str3 = str1 + str2 ;

System.out.println(str3) ;

-> hakeri2sec


이런식으로 문자열 변수로써 +-를써서 합치고 뺄수있다.


특징은 한번 만들어진 값을 변경하지 않음! 이라는 것이다.

위에 우리가 str3에 4444를 집어넣었지않는가? 이공간과

str3 = str1 + str2 해서 hakeri2sec이 저장된 공간이 서로다르다 라는점!

str3(4444)는 여전히 남아있다.

즉 상수로써 한번 할당받은 공간은 사라지지 않지 이거 많이쓰면 메모리 소비가 심해서 느려지겠지?

그래서 보안된게 StringBuffer이다. (근데 뭐 컴퓨터좋아져서 그냥 다무시하고 String을 거의다씀)


byte[]배열을 생성자 매개변수로 받는 String

String charsetName은 "UTF-8" 이런거 말한다. 만약에 byte[]가 UTF-8로 인코딩 되있으면 디코딩시 UTF-8 지정해줘야 한다.

Hello라는것만 문자열로 만들라면 \r\n은 제외해줘야하므로 readByteNo-2를 해줘야한다.



String.split("/"); 이것도 자주쓰임


Split()

정규표현식을 구분자로해서 부분 문자열로 분리한 후, 배열에 저장하고 리턴한다.

String name = "홍길동&이수홍,박연수,김자바-최명호";

String[] a = name.split("& | , | -");   -> [홍길동],[이수홍],[박연수],[김자바],[최명호]


"\\?" , "\\" 이런거도 가능


charAt()



getBytes()



indexOf()



replace()



Substring()



trim()


ex) String str1 = String.valueOf(10);                --> "10"

     String str2 = String.valueOf(10.5);              --> "10.5"

     String str3 = String.valueOf(true);              --> "ture"



2. StringBuffer


StringBuffer sb1 = new StringBuffer("abc") ;

new를 썻기때문에 StringBuffer라는 공간이 힙에 할당되고 "abc"가 들어가있다.

이공간의 주소를 sb1에다가 주는것이지

고로 sb1 = "def"를 주면 저기 할당된 공간에 abc를 지우고 def가 새로 쓰여짐

메모리 공간을 잘아낄수 있겠지? (근데 뭐 컴퓨터좋아져서 그냥 다무시하고 String을 거의다씀)


2-1. 문자열 추가(append)

2-2. 문자열 삽입(insert)

2-3. 문자열 추출(substring)

이 가능하다. 찾아봐^^


배열

  • 같은 타입의 데이터를 연속된 공간에 저장하는 자료 구조
  • 각 데이터 저장 위치는 인덱스를 부여해서 접근가능 0 번부터시작
  • 중복된 변수 선언을 줄이기위해
  • 반복문을 이용해서 요소들을 쉽게 처리하기 위해

배열변수도 참조변수이다

배열의 본질은 힙영역에 공간할당되고, 

int[] a = {0,1,2,3,4};   // a는 참조변수임. 0인덱스(시작지)의 주소지를 가져오는것


배열생성시 값 초기화

a. String[] names = {"신용권","이상진","감자바"};          //선언과 동시에 값 초기화

b. String[] names;                                                 //선언후 나중에 값 초기화

   names = new String [] {"신용권","이상진","감자바"}; 


배열생성시 값 초기화x 저장할 배열을 미리 생성

a. 타입[] 변수 = new 타입[길이];

b. 타입[]변수; 

    변수 = new 타입[길이];

char[] b = {'a','b','c','d','e'}

자바에선 알아서 할당해준다 이게 실제로는

int[] a = new int[5];

char[] b = new char[5];

이렇게 사용되는거다 나중에 배우겟지만 그래서 C언어에서는 배열이 Stack에 올라가지만

자바에선 Heap에 올라간다. new가 들어가기 때문이지



배열길이 : 배열에 저장할수 있는 전체 항목 수

int[] mem = { 1, 2, 3 };

systme.out.println(mem.length);     --> 3


mem.length=5; (x)  //배열의 길이는 읽기전용


for(int i=0; i<mem.length; i++) {     //배열의 길이는 for문에서 주로사용 (자바에선 이보다 for each로 자주씀)

systme.out.println(mem[i]);

}


for(int a : mem)                           //for each형식

{

system.out.println(a)

}




객체를 참조하는 배열


Int [] a = new Int[3]  힙영역에 Int[3]의 공간이생기고 각 값을 가지고있고 그주소를 a가 스택영역에서 가지고 있는것이다.

그런데 객체를 참조하는 배열을 만들면 힙영역에 객체[3]의 공간이 생기는데 여기에 값이아닌 객체들의 주소를 가지고있다.

String값들은 "Java"는 실제로 객체라 보면된다.






배열복사



ArrayList (리스트)

-크기가 정해져 있지 않은 배열 
C언어 배열에선 int배열은 정수값들만 char배열은 문자값들만 쓸수있었다면 Java는 아니다.
그냥 잡종으로 다써도 알아서 메모리에 올려준다.
(나는 String만 쓸수있게 할꺼야! 하면 이제 제네릭스 하면된다
 ex) ArrayList<String> a = new ArrayList<String>( ) ;  // 문자만 담을꺼야!
 ex) ArrayList<Integer> a = new ArrayList<Integer>( ) ;  // 정수만 담을꺼야!

-목록 추가, 삭제, 검색, 크기 ,추출 가능

ex) 추가하고 인덱스번호만 가져오기

import java.util.ArrayList;

ArrayList a = new ArrayList( ) ;

a.add(1234);
a.add("abcd");
a.add("i2sec");

System.out.println(a);
-> [1234 , abcd , i2sec]
System.out.println(a.get(1));    // a.get(인덱스번호)
-> abcd


HashMap

-키와 값을 하나의 쌍으로 묶어서 저장하는 자료형

약간 데이터베이스 느낌인데 key값과 value값을 각각 저장하고 key값을가지고 value값을 불러오고 쓰는건데
구지 쓸일이 있을까 싶은 생각이드네
일단 필요하면 찾아보면서 쓰자 정리는 따로안할게 책에는 있네

이역시 제네릭스 가능하다
HashMap<String , String> a = new HashMap<String , String> ( ) ;     //앞은 key값, 뒤는 value값


Scanner 표준입력

C언어에서 scanf가 있었다면 Java에선 Scanner가 있다.
(뭐 자바에선 그리 많이는 안쓰인다 console기반으로 잘안하고 gui로 textbox로 입력받으니)

nextLine(); 문자입력
nextint(); 숫자입력

ex) nextline

import java.util.Scanner;

Scanner a = new Scanner(System.in);
String b;
System.out.println("문자를 입력하시오 : ");
b = a.nextLine();
System.out.println(b);


ex) nextInt

import java.util.Scanner;

Scanner a = new Scanner(System.in);
String b;
System.out.println("숫자를 입력하시오 : ");
b = a.nextInt();
System.out.println(b);


삼항 연산자

포멧스트링,연산자우선순위,산술연산자관계연산자,논리연산자,대입연산자,증감연산자,캐스팅연산자 모두 C와동일

그러나 C언어에는 없는 삼항 연산자라는게 있는데

System.out.printf("%d \n", a > b ? a : b);

a>b가 참일때 a를 표현
a>b가 거짓일때 b를 표현



제어문

if , else if , while , do while , for 모두 C언어와 동일하다.  //단 while(1) 이런거 안됨 while(Ture) 해야함

C언어에서 없는건 Java에서 반복문 for each 인데


배열을 나타 낼때 쓴다.

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

이란게 있다고치고 이를 표현하려면

for문 

for(int i=0; i<numbers.length; i++)    // 여기서 중요한거2개 

{

System.out.println(numbers[i]);

}

// 1. for문안에서 int i=0; 해서 선언과동시에 초기화가능 (C에서는 위에 선언따로하고 초기화 따로하고)

// 2. numbers는 인스턴스화도 안하고 배열인데 어찌? numbers.length가 되지?

// 이는 배열에서도 말햇는데 int[] numbers = new int[6] ; 이된거거든 사실 그러니 가능하지


for each문

for(int num : numbers)
{
System.out.println(num);
}

//단! 배열에 같은 자료형값이 들어가있어야 가능하다 int num이니까. ArrayList는 될까? 음 안될거같은데
  같은자료형만 넣어두면될라나 모르겟네.. ㅎㅎ 난중에해보자


블로그의 정보

독한 개발자

#독개#

활동하기