지금부터 다룰 부분은 C언어, C++언어와 중복된 부분이 많습니다.
중간중간 적절히 생략하겠습니다.
1.자바 프로그램 코드의 구조
자바프로그램 *.Java 는 반드시 1개 이상의 클래스를 가지고 있습니다. class
클래스를 작성할때는 아래의 순서에 맞게 선언합니다.
접근제어자, class키워드, 클래스명, { 클래스 내용 , } 순으로 선언합니다.
예시) public class Test
{
내용
}
public : 접근제어자, 클래스 선언 키워드. - public 클래스는 파일명과 클래스명이 동일하다.
class
Test : 클래스명
이클립스에서는 설정을 변경하지 않으면 기본적으로 public 클래스로 작성되며 파일명도 클래스명과 동일하게 저장된다.
하나의 자바 파일은 여러개의 클래스를 가질수가 있다. public클래스는 한 파일에 하나만 올수가 있다. 일반적으로 여러개의 클래스가 자바파일에 포함된다면 보통 main() 메소드를 갖는 클래스를 public으로 지정한다.
클래스는 경우에 따라 클래스를 패키지(클래스의 집합체)에 참가시키거나, 다른 클래스를 inport 받을 수 있다.
클래스를 패키지에 참가시킬 때는 package문을 자바 파일의 가장 첫번째 줄에 기술해야 한다.
다른 클래스를 import 받을때는 import문을 사용해야 한다. - 패키지문 다음, 클래스 선언위에 기술해야함.
예시)
package dodo.test; // dodo.test 라는 패키지 선언. dodo\test 폴더안에 생성
import javax.swing.JPanel; 아래에 쓸 Tests 클래스에 필요한 JPanel 클래스를 import 함
public class Tests extends Jpanel Tests 클래스영역이다. extends는 상속을 허용하는 키워드이다.
{
}
키워드는 C언어로 따지면 내장된 시스템명령어(예약어)이다. 예를 들면 printf는 변수이름으로 쓸수 없는것 처럼 말이다.
위의 import 개념과 extends 개념이 위의 빨갛게 써놓은 2줄의 의미이다. 잘알아놓자.
1.2 멤버필드와 메소드
클래스는 멤버필드와 메소드를 가지는데 이들은 전역변수이다. (반드시 쓸 필요는 없다. 필요에 따라서)
멤버필드 : 멤버변수, 인스턴스변수, 프로퍼티라고 불리며 전역변수이다.
메소드 : 프로그램의 실행코드를 기술하는 공간. 클래스가 어떤 처리를 하려면 메소드를 선언한 후에 메소드 내에 그 처리를 기술한다. (메소드라는건 지역이라는 의미이다. C언어에서의 지역변수변수 중괄호안을 의미한다!)
예시)
public class Tests //클래스 영역
{
int a; //멤버필드
public String process(String ID) //메소드 영역, process라는 메소드를 선언.
{
return ID;
}
}
즉, 자바에서 쓰이는 변주중에서 클래스의 멤버로 사용하는 전역변수가 멤버필드이다.
또한 메소드 내에서 선언되어서 사용하는 변수가 지역변수 또는 자동변수라고 한다.
만일, 지역변수와 멤버필드의 변수명이 같을경우에는 해당지역내에서는 지역변수가 우선권을 가진다. (C언어와 동일)
** 주석을 다는 방법**
C언어와 동일하다.
한줄주석 : //
한줄이상 주석 : /* 해당내용 기술 */
2. 자바 식별자와 키워드
자바 식별자 : 클래스명, 메소드명(C언에선 지역함수명), 멤버필드명(전역변수명), 지역변수(=자동변수) 등을 말한다.
자바 식별자는 길이의 제한이 X, 첫글자는 영문자나 _ 밑줄또는 $ 로 시작해야한다. 꼭 C언의 이름을 짓는규칙과 비슷하다.
(대소문자가 구별이 되기때문에 주의하자)
※ 클래스명 작성 규칙
클래스명의 첫글자는 대문자로 작성하며 나머지는 소문자로 한다. 만약 단어가 구별이 되면 다음단어의 첫글자는 대문자로 한다.
예시) AppleKim, IphoneApp
※ 메소드명, 멤버필드명, 지역변수명 작성 규칙
클래스명과는 반대로 첫글자는 소문자로 작성하고, 다음 단어가 구별되면 첫글자는 대문자로 한다.
머..위와 같이 꼭 할필요는 없지만..세상은 보이지 않는 규칙이 지켜질 때 사회가 더 아름답지 않은가?..생각이 든다.ㅋㅋ
(참고로 자바는 유니코드로 이루어져 있기때문에 한글도 사용이 가능하지만..되도록 쓰지 않는 것을 추천한다.)
2.1 키워드 (예약어)
자바또한 C언어처럼 프로그램에서 사용하는 예약어인 키워드가 존재한다. 따라서 이들은 자바 식별자의 이름으론 사용해선 안된다. 키워드의 예는 아래와 같다.
abstract, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, final,finally
float, for, goto, if, implements, import, instanceof, int, interface, long native, new, package, private, protected, public, return
short, static, super, switch, synchronized, this, throw, throws, transient, try, void, volatile, while
3. 변수 및 자바의 데이터 타입
변수 파트는 C언어와 동일한 개념이라서 생략하고 다른개념들만 정리하겠다.
*이클립스에선 변수를 선언하고 사용하지 않으면 경고가 표시된다. (경고마크는 전등불에 느낌표가 있는 아이콘이다)
3.1 전역변수
"전역변수 = 멤버필드" 는 자동적으로 초기화되기때문에 사용전 초기값을 할당하지 않아도 에러가 생기지 않는다.
byte, short, int, long, double, char 타입은 = 0으로 초기화
boolean 타입 = false
String 타입 = null 로 초기화 된다.
그리고 전역변수는 접근제어자가 붙는다. 왜나하면 멤버필드는 다른 클래스에서 참조할수 있기 때문에 그 접근영역을 설정해야 한다. 자세한 내용은 후에..다시..
예시)
package test1;
public class Tests //Tests 라는 클래스를 선언함
{
static boolean x; //멤버필드로 불리언형의 x를 선언 (초기화 하지 않았지만 false로 초기화됨)
public static void main(String [] args) //main() 메소드 선언
{
boolean y = true; //지역변수 y선언하고 초기화를 참으로
System.out.println("x = " + x);
System.out.println("x = " + y);
}
}
결과값은 x = false , y = true 로 나오게 된다.
이 예시를 통하여 멤버필드는 기본값이 자동 초기화 된다는것을 알수 있다.
도한 static main() 메소드에서 객체의 레퍼런스 없이 멤버 필드값에 접근하려면 해당 멤버가 static 변수이어야 한다는 사실도 알수있다. static 으로 선언된 메소드에서는 static으로 선언된 멤버필드나 메소드에만 접근 할수가 있다. - 후에 다시 설명.
3.2 기본 데이터 타입
1) 데이터의 타입은 기본데이터 타입과 레퍼런스 데이터 타입이 존재한다.
기본데이터 타입 : byte, short, int, long - 정수타입
float, double - 실수타입
char - 문자타입
boolean - 불 타입
* 캐스트 연산 (강제형변환) 은 C언어와 동일하다. 바꾸고자하는 변수앞에 (자료형) 을 붙이면 된다.
예시 ) int value1 = 3;
float value2 = (float)value / 0.2;
만약 캐스트연산을 하지 않았을 경우에는 어떻게 되는가?
데이터 타입 큰쪽으로 자동 형 변환이 된다. 이를 = 프로모션(promotion)이라고 한다.
예를 들어 int타입 + float타입의 연산을 할 경우에는 float타입으로 통홥되어서 연산이 이루어진다.
문자 데이터타입 char은 16bit 유니코드로 표현이되며 C언어와는 다르게 문자 1개를 표현하기 위해서 2byte의 공간이 필요하다.
만약 문자 데이터 값에 직접 변수를 대입할때는 char value = 'A' 와 같이 작은따움표로 표현해야한다.
불리언 타입은 C언어와 동일하게 bit 타입으로써 1bit의 크기를 가진다.
2)레퍼런스 데이터 타입
객체가 있는 곳의 주소를 저장하는 데이터 타입이다. 이는 C언의 포인터와 동일한 개념이며, 자바에서는 포인터가 없기때문에 객체의 레퍼런스로 생성된 객체를 통해 접근하는 방법을 사용한다. 레퍼런스 타입은 객체타입이라고도 말한다. = 클래스타입
예시)
public class TestRef
{
int a= 10; // 기본타입의 변수 a를 선언후 초기화
Val aa; // Val 클래스 타입의 레퍼런스 변수 aa를 선언
aa = new Val(); // Val 클래스의 객체를 생성하여 객체의 주소를 aa 변수에 저장함.
} // 레퍼런스 타입의 변수는 new 키워드를 사용해서 객체를 생성하기 전까지는 메모리가 할당되지 않는다.
// 레퍼런스 변수의 기본값 = null
aa안의 값은 10이 아니라 ㅁ라는 객체가 저장된 장소의 메모리값이다.
1) String 클래스를 사용하여 문자열 변수 지정하기
문법 : String 변수명; 으로 선언.
예시) int a = 10;
String test1 = "TestT";
String test2 = "TestT";
이때 TestT는 문자열은 문자열변수에 해당하는 만큼 2개가 생성되는것이 아니라 단 하나만 생성되며 동일한 주소의 문자열을
가리킨다. 이는 JVM내에 저장된다.
2) 연산자
C언어와 동일하므로 생소한 연산자만 정리하겠다.
-시프트 연산자
<<왼쪽시프트 : 왼쪽으로 숫자를 이동한다. (곱하기2의 효과) 오른쪽의 빈곳은 0으로 채워진다.
>>오른쪽시프트 : 오른쪽으로 숫자를 이동한다. (나누기2의 효과) 왼쪽의 빈곳은 0 (만약 부호가-이면 1로) 채워진다.
>>> 오른쪽 시프트 : 위와 동일한 오른쪽 시프트연산자이나 빈곳은 무조건 0 으로 채워진다.
-조건 연산자
? : 형태의 조건 연산자의 문법
변수 = 조건식 ? 참일때값 : 거짓일때값
s = (3 > 1) ? 5 : 6; // 3이 1보다크면 참이면 5값이 변수a에 대입된다.
-instanceof 연산자
객체의 상속 관계 여부를 알아볼 때 사용하는 연산자이다. 상속 관계는 불리언 형태는 false(없다), true(있다) 값으로 리턴한다.
- '==' 연산자와 'equals()' 메소드의 비교
== 연산자는 두 변수의 값이 같은가를 비교함.
equals() 메소드는 두 객체의 내용이 같은가를 비교하마.