개발자 끄적끄적
연산, 문자열, 변수 본문
<자바의 특징>
- 플랫폼의 독립성 : 자바로 작성된 프로그램은 하부의 플랫폼과는
상관없이 자바의 가상 머신 위에서만 운용한다
- 객체지향 언어 : C++보다 더욱 막강하고 완벽한 객체 지향성을 보장한다
- 멀티 쓰레드 지원
- 자동 메모리 관리 : 자바 가상 머신이 작동으로 사용되지 않는 메모리를 찾아 해제해 준다
- 동시성능 확장 제공 : 프로그램의 성능이 확장되었거나 개선되었을 때
네트워크를 통해 자동으로 다운로드 되어 설치될 수 있다
- 네트워크와 분산처리 지원 : 비교적 짧은 시간에 분산처리 지원 프로그램을 개발할 수 있다
<자바의 구조>
<바이트 코드>
- 자바는 컴파일을 실행하면 기계어가 아닌 '바이트 코드'라는 중간 단계의
컴파일 결과를 생성한다
이 코드는 하드웨어나 O/S와는 무관하게 작동되며 이는 자바가 설치되어 있으면
재 컴파일 없이 바로 될 수 있도록 되어 있다
<자바 가상 머신>
- 소프트웨어적으로 만들어진 일종의 CPU이다
- 단독으로 존재 할 수도 있지만 다양한 웹 브라우저 내에 존재 할 수도 있다
- 바이트코드를 실행시켜 주는 소프트 웨어 CPU이다
<자바 설치 환경 체크>
1. JAVA_HOME
탐색기>내 PC>마우스 우클릭>속성>고급시스템 설정>고급>환경변수
2. PATH
Windows>preferences>java>Installed JREs
3. ECLIPSE에서 자바 연결
4. JAVA_PROJECT 생성
<자바의 기본 구조>
- 자바를 사용하여 무언가를 하려면 반드시 class구조 안에서 해야 한다
- 컴파일하여 실행할 수 있는 구조도 class이다
- 비록 한 문자를 출력하려고 해도 class라는 구조를 갖고 있어야 한다
package 패키지명 -1)
import 풀 네임의 클래스 명 -2)
class 클래스명{...} -3)
접근자 멤버 변수; -4)
접근자 반환형 메소드(매개변수){...}; -5
public static void main(String[] args){...} -6)
메인 프로그램 -7)
[코드 설명]
1)package
- class가 위치하고 있는 장소를 의미한다
일반적으로 도메인의 역순으로 package명을 기술하는데 이는
class이름이 동일하더라도 서로 구분될 수 있도록 하기 위한 묵시적인 약속이다
- 하나의 class파일엔 하나의 package만 사용할 수 있다
- 주석을 제외한 코드의 첫줄에 작성해야 한다
- 저장장치내에는 하나의 폴더로 만들어진다
예를 들어보면,
개발사의 도메인이 jobtc.kr이라고 가정하면 해당 개발사에서 개발되어
배포되는 클래스는 모두 kr.jobtc라는 패키지명을 갖는게 원칙이다
따라서, class를 작성 할 때 아래와 같은 방법으로 package명을 작성한다
=>package.kr.jobtc;
만약 해당 개발사에서 member라는 프로젝트로 class를 묶어야 한다면
=> package kr.jobtc.member;
2) import
- 참조하려는 클래스를 지정하며 여러번 사용이 가능하다
- 다른 패키지에 있는 클래스들은 "패키지명. 클래스명"처럼
패키지명을 지정해야 사용할 수 있다
- import문장은 외부 패키지에 있는 클래스를 참조하도록 하는 코드이며,
코드상에서 클래스명을 풀네임으로 사용하지 않아도 되도록 해주는 기능을 갖고 있다
*자바 키워드는 소문자
*자바의 모든 실행 코드 중 package와 import문을 제외 하고는 반드시 class영역 안에 기술되어야 한다
또는 자바는 기본적으로 class뒤에 쓰여진 클래스명을 파일명을 지정해야 하며
대부분의 경우 하나의 파일안에 하나의 클래스를 지정한다
클래스명은 대소문자 구분 없이 지정할 수는 있으나 일반적으로 대문자로 시작한다
*멤버 변수
- 클래스 내부 전 지역에서 사용할 수 있는 변수를 의미
- 다른 용어로 필드(Field), 인스턴스(Instance)형 변수, 전역 변수라는
이름으로도 사용된다
- 자바에서는 필드(Field)란 단어로 사용한다
3) 메서드
- 하나의 클래스에는 여러개의 메서드(Method)를 기술할 수 있는데
이는 특정 처리가 반복되거나 다른 처리 내용들과 구분이 필요할 때
선언(정의)해서 사용할 수 있다
4) main()함수(Method)
- 클래스로 만들어진 "프로그램을 시작하는 기능"을 하는 아주 독특한 함수
구조는 반드시 "public static void main(String[] 매개변수){}"
와 같이 선언해야 하며 이 때, '매개변수'만이 개발자 임의대로 지정할 수 있다
- 만약 매개변수 이외에 어떤 값을 변경하면 프로그램을 시작하게 하는
main함수의 기능이 상실되고 일반 함수(Method)로 처리된다
6) public static void main(String[] args){...})
- 반드시 프로그램이 시작되는 클래스에 작성되어 있어야 한다
-------------------실행창-------------------
package core;
public class Begin {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
*public class Begin {...}"
- class 타입 -> 완제품(객체 생성이 된다)
- interface 타입(완전 추상) -> 빈 깡통(객체 생성이 불가능)
- abstract class 타입(추상 클래스) -> 반제품(객체 생성이 불가능)
*"객체가 생성된다" = "실행 된다"
- public : 아무나 사용할 수 있다
즉, "Begin이라는 클래스를 아무나 사용가능하도록 만든다"
*public static void main(String[] args){...}
- static(정적형) : 객체가 생성되기 전에 메모리에 올라간다
즉, Begin이라는 객체가 생성하기 전에 메모리에 올라가기 때문에
프로그램이 실행가능하다
- "main()"는 함수(=Method)를 의미한다
- "void"는 반환값이 없다
- "String[]"문자열의 배열타입을 의미한다
- "args"개발자 임의로 바꿀 수 있다
--------------------------------------
<변수>
- 단어적인 의미는 "변하는 수"라는 의미를 갖고 있다(고정값이 아니다)
<프로그램에서 변수란?>
- 변수 자체가 갖고 있는 의미 뿐만 아니라 프로그램에서 변수란
어떤 하나의 값을 지정하고 있는 메모리 위치를 기호화 한 것을 나타낸다
<변수를 정의하는 방법>
- 영문자, 한글을 사용(그러나 한글을 사용하여 변수를 지정하지 않는다)
- 숫자를 사용할 수 있으나 숫자로 시작할 수는 없다
- 대소문자를 구분하나 일반적으로 변수명은 소문자로 시작한다
- &,_ 이외의 특수 문자를 사용할 수 없다
- 공백 문자를 사용할 수 없다
<리터널(상수)란?>
- 리터널(상수)란 절대값이 바꾸지 않는 값을 의미
<리터널의 종류>
- 숫자 리터럴 : 정수와 실수 모두
- 문자 리터럴 : 작은 따옴표 안에 있는 한 글자
- 문자 리터럴 : 큰 따옴표 안에 있는 문자
- 논리형 리터널 : true, false
*'a', '한' -> 문자
"a", "한" -> 문자열
<변수에 저장하기>
- 리터럴에 리터럴을 저장할 수 없다
이유->리터럴을 정의할 때 "절대값이 바뀌지 않는 수"란 의미가 있기 때문
<변수의 기본형>
1. 논리형
- 예약어 : boolean
- 범위 : true, false
2. 정수형
a. 문자형
- 예약어 : char
- 범위 : 16비트(2^16)
b. 수치형(바이트)
- 예약어 : byte
- 범위 : 8비트
c. 수치형(16비트 정수)
- 예약어 : short
- 범위 : 16비트(-32,768~32,767)
d. 수치형(정수)
- 예약어 : int
- 범위 : 32비트(-2,147,483,648~2,147,483,647)
e. 수치형(64비트 정수)
- 예약어 : long
- 범위 : 64비트
3. 실수형
a. 수치형(실수형)
- 예약어 : float
- 범위 : 32비트
b. 수치형(64비트 실수형)
- 예약어 : double
- 범위 : 64비트
<특수 문자>
\n : New Line
\r : Return
\t : Tab
\b : Backspace
\f : Formfeed
\' : Single Quoute
\" : Double Quoute
\\ : BackSlash
<기본형 변수 선언 방법>
- 하나의 변수에는 하나의 값만 존재
<변수 선언 방법>
- 변수형 변수명;
- 변수형 변수명 = 초기값;
<논리형(Boolean)>
- 논리 형태의 값을 지정할 때 사용
<논리형 변수 선언 방법>
[가능]
- boolean 변수명 = 초기값;
- boolean 변수명;
- boolean b = true //논리형 변수 b를 선언하고 초기값으로 true를 저장
- boolean a; //논리형 변수 a선언
- a=true //논리형 변수 a에 true저장
[불가능]
- boolean b='a' //'a'형태가 논리 형태가 아닌 문자형이기 때문
- boolean b=123;
- boolean b="park"
- boolean a;
a=123;
- boolean b=true false //두 개의 값을 동시에 지정할 수 없다
<문자형(char)>
- 숫자, 영문자, 한글, 기타 특수 문자등의 한 글자를 저장한다
- 정수를 대입할 경우 정수에 해당하는 문자가 대입된다
- 문자형(char)도 크게 보면 정수형이기 때문에 산술 연산이 가능하다
[방법]
- char 변수명 = 초기값;
- char 변수명;
[가능]
- char c='1' //문자 1에 해당하는 코드 번호 49를 대입
- char c='A' //문자 A에 해당하는 코드 번호 63을 대입
- char c='한'; //문자 '한'에 해당하는 코드 번호 54620을 대입
[불가능]
- char c=''; //작은 따옴표 안에 아무것도 없는 경우 해당 문자가 없으므로 대입 불가
- char c='ab' //두 글자는 문자열이기 때문에 대입 불가
- char c=65536 //0~6535까지만 대입 가능
- char c=-10; //표현 할 수 있는 값의 범위가 아니다
<byte>
- 1바이트(8bit)크기의 값을 저장할 수 있는 변수이다
- 값의 범위는 -128~127까지의 범위의 정수이며 연산 결과가
이를 벗어나면 값이 +,-를 순환된다
<short>
- char형과 동일하게 2byte크기를 갖고 있지만 값의 범위가
-32,768~-32,767까지의 정수이다
- 연산 결과가 허용 값의 범위가 벗어나면 +,-가 순환된다
<int>
- 가장 일반적으로 사용되는 정수 타입이다
- 범위가 대략 -21억~21억까지 이므로 이 보다 큰 수를 다루는
다른 업무에서는 부적합하다
<long>
- 8byte의 크기로 int타입보다 더 큰 수를 표현 할 수 있다
- long타입을 정확히 사용하려면 숫자 뒤에 'L' 또는 'I'를 붙여 줘야 한다
<float>
- 4byte크기로 실수를 저장한다
- 실수 뒤에 'f'또는 'F'를 붙여줘야 float타입으로 인식한다
- 메모리를 극히 많이 사용하는 구조가 아니거나
유효 자리 수가 더 정밀해야 한다면 double타입을 권장한다
[방법]
- float f = 3.14f
- float f = 3.1f
[가능]
- float f =3f //자동으로 소숫점이 붙는다
- float f = 3f //자동으로 소숫점이 붙는다
- float f ='1' //문자 1에 해당하는 49에 소숫점이 붙어 49.0을 대입
- float f ='a' //문자 a에 해당하는 97에 소숫점이 붙어 97.0을 대입
- float f = (float)3.14; //double 타입의 수가 float타입으로 형 변환되어 대입
[불가능]
- float f = 3.14; //자동으로 형 변환되지 않는다
- float f ="a"; //문자열은 숫자로 변환되지 않는다
- float f =3.0000000000001f //우효 자리를 벗어난다
<double>
- 8byte의 크기이며 일반적으로 표현하는 실수는 double형이다
- 숫자 끝에 D 또는 d를 붙여 사용하지만 일반적으로 생략한다
[방법]
- double d = 0.14D or 0.14d or 0.14
[가능]
- double d = 0.14;
- double d = 3; //자동으로 형 변환
- double d = 3f; //자동으로 형 변환
- double d ='A' //문자 A에 해당하는 65를 double타입으로 변경하여 65.0을 대입
- double d = (double)3; //정수 3을 형 변환하여 3.0대입
- double d = 3.14ㄹ*10; //연산 결과를 double형을 변환하여 대입
[불가능]
- double d = "a"; //문자열은 숫자로 형 변환 되지 않는다
- double d = "10" //따옴표로 둘러 쌓여 있으면 값이 숫자형이라도 문자열이 된다
<기타(BingInteger, BigDecimal)>
- Long타입보다 큰 수라면, BingInteger
- double타입보다 크고 정밀한 수를 처리할 때는 BigDecimal을 사용
- math패키지 안에 있는 클래스 이며 new연산자를 사용하여 객체를 생성, 사용한다
<고정 문자열과 가변 문자열>
<String>
ex)고정 문자열(String)
String name="park"
name = "hong" 일 때
- name이 park이라는 문자를 갖는게 아닌 name은 park과 hong이라는
문자열을 갖는다
- park이라는 문자가 hong이라는 문자로 변하는게 아니다
"park" - 100번지
"hong" - 140번지 일 때,
최종적으로 name이 가리키는 (메모리)값은 name=104번지를 가르킨다
ex)가변 문자열(StringBuffer or StringBuilder)
<주요 메서드>
- char charAt(int index) : index에 있는 문자 반환
- boolean equals(Object str) : str과 같은 문자열인가 판단
- String substring(int beginIndex) : beginIndex <=반환 문자열 < endIndex
endIndex가 생략되면 beginIndex부터 문자열 끝까지를 잘라 반환
- byte[] getBytes()
byte[] getBytes(Charset set) : 문자열을 byte배열로 반환
Charset이 있으면 문자열을 해당 문자셋으로 인코딩
- int indexOf(String str [, int fromIndex]) : 문자열이 시작되는 위치를 반환,
fromIndex이후의 위치
<charAt>
ex)주민번호를 사용하여 성별을 구분하여 출력
단, 주민번호 뒷자리의 첫 글자가 홀수이면 남자, 짝수이면 여자
String jumin = "950815-2412317";
char c = jumin.charAt(7);
int r = Character.getNumberValue(c);
String str = null;
if(r%2==0) str = "여자";
else str = "남자"
System.out.println(str) // 여자
<equals>
ex)두 회원의 이름이 동일한지 판별
단, 문자열 비교는 '=='으로 하지 않고 반드시 equals()를 사용한다
String name1 = "홍길동";
String name2 ="홍길동";
String name3 = new String("홍길동");
System.out.println(name1 == name2); //true
System.out.println(name1== name3); //false
System.out.println(name1.equals(name2)); //true
System.out.println(name2.equlas(name3)); //true;
- 동일한 문자열이라도 어떤 형식으로 만들어졌는지에 따라
'=='의 연산 결과는 달라지지만 equals()의 처리 결과는 항상 같다
ex)문자열은 '=='를 사용하지 않고 equals메서드를 사용하는 이유
String str1 = "홍길동";
String str2 = "홍길동";
System.out.println(str1==str2); //true -1
System.out.println(str1.equals(str2)); //true -2
String str3 = new String("일지매");
String str4 = new String("일지매");
System.out.println(str3==str4); //false -3
System.out.println(str3.equals(str4)); //true -4
이유 ->
str1은 100번지(주소)를 가리킨다-> "홍길동" 100번지 -1
str2은 100번지를 가리킨다 -> "홍길동" 100번지 -2
str1과 str2가 가리키고 있는 값이 같니? => "홍길동"=> true
"=="는 가리키고 있는 값(홍길동)이 아닌 "갖고 있는 값(번지수)"을 뜻한다
String str3 = new String("일지매")에서
str3 (200) -> "일지매" 200을 가리킨다
'new'연산자는 메모리를 찾지 않고 무조건 새로 만든다
String str4 = new String("일지매")에서
str4(300) -> "일지매" 300번을 가리킨다
3에서 str3이 갖고 있는 값은 200이고, str4가 갖고 있는 값은 300이므로 false
4에서 str3이 갖고 있는 값은 "일지매", str4가 갖고 있는 값도 "일지매"이므로 true
따라서 "문자열"을 비교하려면 equals메서드를 사용해야 한다
*대소관계는 "CompareTo"로 비교한다
ex) a.CompareTo(b)가
양수 일 때 a가 큰 값
음수 일 때 b가 큰 값
ex)System.out.println(str1.compareTo(str3)); //3793 -> 양수반환
->str1이 더 크다
*(녹색)charAt(int index) : char - String
- 어떤 객체, 어떤 클래스 인 가->String이라고 하는 클래스가 갖고있는 값 중
즉, String이라고 하는 클래스가 갖고 있는 것 중에서
- 메소드가 포함되어 있는 클래스 : String
- 매개 변수는 int index(정수형 변수)이다
- 반환 타입은 char(문자열)이다
ex)jumin에 있는 주민번호 substring을 사용하여 생년, 생월, 생일을 분리하여 출력
String jumin = "880102-1234567";
String y = jumin.substring(0,2); //88
String m = jumin.substring(2,4); //01
String d = jumin.substring(4,6); //02
System.out.println(y);
System.out.println(m);
System.out.println(d);
<getBytes>
- 서로 다른 이 기종간의 통신이나 서로 다른 언어로 만들어진
프로그램간의 데이터 통신이 필요할 때, 또는 문자열이 다른 방법으로
인코딩 할 때 유용하게 사용될 수 있다
- 상대방의 프로그램도 동일한 방법으로 인코딩해야한다
- 반드시 예외처리를 해야한다
ex)getByte()을 사용하여 인코딩하기
str = "abc 가나다 1223 !@#";
try {
byte[] enc = str.getBytes("euc-kr");
byte[] iso = str.getBytes("iso8859-1");
byte[] utf = str.getBytes("utf-8");
System.out.println(new String(enc));
System.out.println(new String(iso));
System.out.println(new String(utf));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace(); //오류를 표준 출력 장치에 출력
<indexOf() | length()>
- 하나의 문자열에서 문자열의 길이와 지정된 문자열의 위치 표시
- indexOf : 왼쪽에서 오른쪽으로->
- length : 오른쪽에서 왼쪽으로 <-
ex)indexOf() | length()
String address="서울 봉천동 서울대입구역";
System.out.println("문자열 길이 :" + address.length()); //13
System.out.println("서울대 위치 :" + address.indexOf("서울대")); //7
System.out.println("낙성대 위치: " + address.indexOf("낙성대")); //-1 -> 값이 없을 땐 "음수 값"을 반환
---------------------------------
[미션1]
1) core 패키지에 아무나 접근 가능한 class BeginMiss1을 생성하시오.
(단, public static void main(String[] args)도 함께 생성)
2) main 함수 내에서 다음의 작업을 완성하시오
a) 문자열 변수 mName, mAddress, mPhone에 임의의 이름, 주소, 연락처를 대입 하시오.
b) 정수형 변수 score에 점수 99를 대입하시오.
c) 실수형 변수 level에 값 4.5를 대입하시오.
e) 위에서 선언한 변수의 값들을 모두 표준 출력 장치에 출력하시오.
package core;
public class BeginMiss1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String mName = "이해선";
String mAddress = "서울시 관악구";
String mPhone = "010-4977-8306";
String grade = "A";
int score = 99;
double level = 4.5;
System.out.println(mName);
System.out.println(mAddress);
System.out.println(mPhone);
System.out.println(grade);
System.out.println(score);
System.out.println(level);
}
}
---------------------------------
[미션2]
1) 성적이 정수형 변수 kor, eng, mat, compute에 각각 임의의 값으로
저장되어 있다.
2) 성적을 사용하여 총점과 평균을 계산하시오.
3) 평균이 60점 이상이면 "합격"을 아니면 "불합격"을 변수에 저장
4) 각 성적과 총점, 평균, 결과를 표준 출력 장치에 출력
int kor = 80;
int eng = 75;
int mat = 68;
int compute = 89;
String p="";
String pass="합격";
String non_pass="불합격";
int tot = (kor+eng+mat+compute);
float avg = (tot)/4f;
if(avg>=60) {
p = pass;
}
else {
p = non_pass;
}
System.out.println("국어 :" + kor);
System.out.println("영어 :" + eng);
System.out.println("수학 :" + mat);
System.out.println("전산 :" + compute);
System.out.println("총점 :" + tot);
System.out.println("평균 :" + avg);
System.out.println("합격 여부 :" + p);
*java 연산
정수형 연산 정수형 -> 정수형
ex) int 5/2 = 2
실수형 연산
ex) float f = 5/2 -> 2.5