jxl은 2003년 엑셀 파일까지만 지원해주기 때문에

아래 코드처럼 jxl 라이브러리 활용하여 Workbook 생성시 

import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public String inputFIle(MultipartFile xlsxFile) throws BiffException, IOException {

        Workbook wb = Workbook.getWorkbook(xlsxFile.getInputStream());  <--에러 발생지점
        Sheet sheet =  wb.getSheet(0);

 

'Unable to recognize OLE stream' 에러 발생한다면

엑셀 파일 Excel 97 - 2003 서식 파일 (*.xlt) 이 아니여서 그렇다. 

확장자 .xlsx 는 jxl 라이브러리로 엑셀 접근이 어렵다.

대체 방안1.  POI 라이브러리 활용

대체방안 2. 엑셀 다른이름으로 저장 > 파일 형식 : Excel 97 - 2003 서식 파일 (*.xlt) 선택  저장 후 재진행

 

 

20150916




예외처리(exception handling)


예외처리 작성법

try{

}catch (Exception ex){
처리
}finally{
//예외 발생여부랑 상관없이 무조건 마지막에 실행
}




20150916




인터페이스(interface)


장점


개발시간 단축

표준화 가능

서로 관계없는 클래스들에게 관계를 맺어줌  309쪽

독립적인 프로그래밍 가능



자바는 다중상속이 안되는데 인터페이스를 사용하면 다중상속과 같은 기능을 구현 할 수 있다.



인터페이스 일종의 추상메서드

인터페이스도 스스로 인스턴스를 생성할 수 없다.

추상메서드 와 차이점

몸통을 갖춘 일반 메서드 또는 멤버 변수를 구성원으로 가질 수 없다.


추상메서드와 상수만 가진다.


작성법

interface 인터페이스이름 {

public static final 타입 상수이름 = 값;

public abstract 메서드 이름 (매개변수);

}


모든 맴버 변수는 public static final

모든 메서드는 public abstract

생략 가능 (이유:컴파일시 자동적으로 추가)


인터페이스는 인터페이스끼리만 상속이 가능

interface SuperCar extends car {}

다중 상속 가능

interface SuperCar extends car , car2 {}

인터페이스는 스스로 인스턴스를 만들 수 없어서 구현해주는 클래스를 만들어줘야 한다.


클래스와의 관계는 구현이라고

작성법

class SuperCar implements Moveable {

}


class SuperCar extend Car implements Moveable {

}








20150916



추상클래스(abstract class)


추상 클래스를 만드는 방법

abstract class Car {

//...

}

추상클래스는 인스턴스를 생성할 수 없다.

추상 메소드 없어도 class 앞에 abstract 를 붙이면 인스턴스 생성x

추상클래스도 생성자를 가지고 있다.


추상 메서드 선언부만 작성

abstract 리턴타입 메서드 이름();


상속받는 클래스에서 몸통 {} 부분을 작성함

자식클래스가 구현을 안하면 그 자식클래스도 추상클래스


메서드를 사용하는 쪽에서는 (메서드 이름, 매개변수 ,리턴타입 )만 알면 됨


추상 메서드를 선언하는 이유: 반드시 구현하도록 강요하기 위해서


책 293 page 처럼 공통되고 반드시 구현해야 하는 부분을 추상 메서드로 지정한다.





20150916


다형성(polymorphism)-매개변수의 다형성


매개변수 또한 다형적인 특징이 적용 됩니다.

예를 들어서 SuperCar, BusCar, SuvCar 클래스가 있고 운전자 클래스에서 어떤 차를 다리게 할지를 정하는 run 함수가 있는 코드를 보겠습니다.


class SuperCar{
	boolean r = false;
}
class BusCar{
	boolean r = false;
}
class SuvCar{
	boolean r = false;
}
class Runner {
	run(SuperCar sc){
		sc.r = true;
	}
	run(BusCar bc){
		bc.r = true;
	}
}
class testtest {
	Runner rner = new Runner();
	SuperCar sc;
	BusCar bc;
	rner.run(sc);
	rner.run(bc);
}



Runner 클래스에 있는 run 함수의 매개변수가 SuperCar 클래스 타입이면 SuperCar 타입의 매개 변수만 올 수 있습니다. 그래서 다른 차를 달리게 하고 싶으면 매개변수를 바꿔서 오버로드 해서 차의 종류 만큼 만들어 줘야 하는 불변함이 있습니다.

그런데 모든 차의 공통된 부모 클래스를 상속 받으면 이런 불변함을 해결 할 수 있습니다.



class Car {
	boolean r = false;
}

class SuperCar extends Car{
	
}
class BusCar extends Car{

}
class SuvCar extends Car{
	
}
class Runner {
	run(Car car){
		sc.r = true;
	}
}

class testtest {
	Runner rner = new Runner();
	SuperCar sc;
	rner.run(sc);
}

이런식으로 공통 부모 클래스 Car를 상속받고 15번 줄에 있는 run의 매개변수를 Car 타입의 참조변수로 지정하면 하나의 run 함수로 모든 car 클래스를 상속받은 자식 클래스의 참조타입을 받을 수 있습니다.







'프로그래밍 > java' 카테고리의 다른 글

인터페이스(interface)  (0) 2015.09.16
추상클래스(abstract class)  (0) 2015.09.16
Java 다형성(polymorphism)-instanceof 연산자  (0) 2015.09.16
Java 다형성(polymorphism)  (0) 2015.09.16
java 메서드(method)  (0) 2015.09.12

20150916


다형성(polymorphism)-instanceof 연산자



상속 관계에서는 부모클래스의 참조변수로 자식클래스의 인스턴스를 참조 할 수 있다고 했습니다.
그렇다는 말은 참조변수 타입만으로는 실제 인스턴스 타입을 알 수 없습니다. 그래서 참조변수가 가지고 있는 실제 인스턴스를 알기 위해서  instanceof 연산자를 사용 합니다.

아래 코드로 설명 하겠습니다.
class Car {
.....
}

class SuperCar extends Car {
....
}

class Test2 {
	public static void main(String[] args) {

		Car car = new Car();

if(car instance of SuperCar){  //참조변수 car 가 superCar 와 상속관계이기 때문에 true 를 반환합니다.
      System.out.println("참조변수 car 는 SuperCar 와 상속 관계입니다.");
}
		
	
c = sc; //형변환 생략가능 
sc = (SuperCar)c;  //형변환 생략할 수 없다.		
	}
}
14번if(car instanceof SuperCar){...}  //car 는 Car 클래스의 참조변수 입니다.

왼쪽에는 참조변수 오른쪽에는 타입(클래스명)이 피연산자로 위치하고 결과는 boolean 값으로 true, false 중에 하나를 반환합니다.

instanceof 오른쪽에 있는 피연산자 SuperCar 클래스와 이클래스가 상속받는 모든 부모 클래스와 왼쪽에 있는 참조 변수 타입과의 상속관계를 비교해서 일치하는 클래스가 있으면 형변환이 가능하기 때문에 true 를 반환합니다.


'프로그래밍 > java' 카테고리의 다른 글

추상클래스(abstract class)  (0) 2015.09.16
Java 다형성(polymorphism)-매개변수의 다형성  (0) 2015.09.16
Java 다형성(polymorphism)  (0) 2015.09.16
java 메서드(method)  (0) 2015.09.12
Java 변수(Variables)  (0) 2015.09.12

20150916


다형성(polymorphism)


다형성을 알기 위해서는 상속에 대한 개념을 알고 있어야 합니다.

우선 자바에서 다형성은 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있게 하므로써 다형성을 나타냅니다.

즉 '여러 가지 형태를 가질 수 있는 능력' 을 의미합니다.

그러니깐 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조 할 수 있도록 한 겁니다.


car 클래스와 car 클래스를 상속받는 SuperCar 클래스로 예를 들면

아래 코드와 같이 


class Car {

	int speed = 10;
	void speedUp(){
		++speed;
		System.out.println("car 에서 speed:" + speed + "입니다.");
	}
}

class SuperCar extends Car {

	int speed = 9;
	int model = 2;
	boolean booster = false;
	void speedUp(){
		speed += 2;
		System.out.println("supercar에서 speed:" + speed +  "입니다.");
	}
}

class Test2 {
	public static void main(String[] args) {

		Car c = new Car();
		SuperCar sc = new SuperCar();
		Car c2 = new SuperCar();
		
		System.out.println(sc.model); //2   출력됨
	//	System.out.println(c2.model); // 오류남 변수 model를 사용 할 수 없다.

        System.out.println(c.speed);  //10 이 출력됨
		System.out.println(sc.speed); // 9 가 출력됨
		
		c.speedUp();  //car 에서 speed:11입니다. 가 출렴됨
		c2.speedUp(); //supercar에서 speed:12입니다. 가 출력됨
	}
}

Car 클래스 와  SuperCar 클래스 두 클래스의 인스턴스를 생성하고 사용하기 위해서 24번 25번 줄처럼 Car c = new Car(); 이런식으로 인스턴스 타입과 참조변수의 타입을 일치해서 사용하는건 아시죠? 그런데 여기서 Car 클래스와 SuperCar 클래스 처럼 서로 상속 관계는 Car c = new SuperCar(); 이런식으로 참조가 가능합니다.

그럼 Car c = new Car(); 와 Car c = new SuperCar(); 의 차이를 설명하자면

왼쪽의 참조변수 타입이 가지고 있는 맴버 변수만 사용이 가능합니다. 쉽게 말해서

car 클래스 맴버의 수는 2가지를 가지고 있고 CarSuperCar클래스는 상속받은 2개 와 자신이 가지고 있는 int model, boolean booster 를 총 더한 4가지고 가지고 있습니다.

Car c = new SuperCar(); 를 예를 들면 참조변수가 c 는 Car 클래스가 가지고 있는 맴버변수 2개만 사용 가능합니다. 그래서 car 는 가지고 있지 못한 SuperCar 의 변수는 사용을 할 수 없습니다.

25번 26번 줄에서 같은 인스턴스로 만들었지만 다른 참조변수 인 scc228번29번 줄에서 출력해보면 29번 줄은 참조변수 타입이 Car 라서 SuperCar 가 가지고 있는 model 변수를 사용 할 수 없어요. (오류가 납니다.)

그리고 25번26번 차이처럼 같은 부모클래스와 자식클래스가 둘다 가지고 있는 맴버변수는 참조변수 클래스에 있는 변수를 사용합니다.

하지만 31번32번 차이처럼 같은 부모클래스와 자식클래스가 둘다 가지고 있는 맴버함수는 좀 더 구체화(오버 라이딩)된 자식클래스의 함수를 사용합니다.


반대로 SuperCar sc = new Car(); 는 사용 할 수 없습니다.

위에서 설명 했듯이 참조변수의 타입 맴버 수 만 사용 할 수 있다고 했는데 이런 경우가 되면 사용 할 수 있는 범위중에서 사용 못하는 멤버가 들어가기 때문에 오류가 납니다.

예) sc.model  참조변수 타입 맴버에는 model 변수도 사용 가능 해야 하지만 인스턴스인 car 에는 model 변수가 없기 때문입니다.  

참조변수가 사용할 수 있는 맴버 수 는 인스턴스의 개수보다 같거나 작아야 합니다.






참조변수의 형변환


서로 상속관계인 클래스 사이에서는 참조변수도 형변환이 가능합니다.

자손 타입 -> 조상타입 (Up - casting) : 형변환 생략가능
조상타입 <- 자손타입 (Down-casting): 형변환 생략불가

아래 코드에서 처럼
class Car {
.....
}

class SuperCar extends Car {
....
}

class Test2 {
	public static void main(String[] args) {

		Car c = new Car();
		SuperCar sc = new SuperCar();
	
c = sc; //형변환 생략가능 
sc = (SuperCar)c;  //형변환 생략할 수 없다.		
	}
}

아래 코드에서 와 같이 car 와 SuperCar 처럼 상속 관계에서는 15번 줄처럼 형변환이 가능하다. 형변환을 하면 인스턴스의 멤버중 사용 할 수 있는 범위가 달라지게 됩니다.
sc 의 참조변수 타입이 SuperCar 라서 superCar 클래스의 변수를 모두 사용 가능한데 c 참조 변수로 형변환을 하게 되면 Car 클래스가 가지고 있는 변수들만 사용 가능합니다.  

참조변수 형변환은 참조변수의 타입이 변환되는 것이기 때문에 인스턴스는 변하지 않습니다.




20150912



메서드(method)


메서드 자주 사용되는 내용(특정 기능을 수행)의 코드를 메서드로 작성해 놓고 호출 을 하는 방식으로 코드의 양을 줄이고 메서드 한쪽에서만 관리할 수 있어서 유지보수가 편리해 집니다.


* 메서드는 한 가지 기능만 수행하도록 작성

* 반복적으로 수행 되어야 하는 여러 문장을 하나의 메서드로 정의

* 관련된 여러 문장을 하나의 메서드로 만들어 놓는것이 좋습니다.



함수 작성법

리턴타입 메서드이름 (타입 변수명, 타입 변수명,...) {

//메서드 호출시 수행될 코드

}


직접 코드로 작성하면 아래와 같습니다.

int add (int a, int b){   <- 선언부

int result = a + b;       <- 구현부

return result;

}


int add (int a, int b){
  //구현부
int result = a + b;
return result;
}


메서드 마지막 부분에 return 혹은 { }블럭 마지막 문장까지 수행 했을때 종료되고 호출 했던 부분으로 돌아갑니다.


반환값이 없으면 return;  만 작성하고

있으면              return 반환값;   을 작성 하시면 됩니다.


반환값의 타입은 리턴타입과 일치해야 합니다. 

int add(int a, int b) 선언부에서 리턴 타입 intretrun 반환값타입이 일치해야 합니다.


함수 호출방법

참조변수.메서드이름(); 

static 메서드는 같은 클래스 안에서 인스턴스 메서드를 호출 할 수 없어요.

이유는

클래스 로딩과 객체를 만들고 생성자로 초기화 하는 순서를 생각 하셔야 해요.

클래스 로딩-> 객체 생성

static 은 클래스가 로딩될때 만들어지고 인스턴스 는 코드가 실행이 되어야 객체를 만듭니다. 그런데 인스턴스가 만들기 전에 사용할 수 있는 static 메서드에서 인스턴스 메서드를 사용하는건 아직 만들어지지 않은것호출 하는 것이 되겠죠? 

(그래서 안됩니다.)




재귀 호출

메서드 내부에서 자기 자신의 함수를 호출 하는것

팩토리얼(!) 을 예로 들 수 있습니다.

아래 코드로 설명할게요.


long factorial (int n){
	long result = 1;
	if (n == 1) {
		result = 1 ;
	}else {
		result = n*factorial(n-1);
	}
	return result;
}



함수 파라미터 값인 n이 함수 안에 코드에서 n의 수를 줄여가면서 다시 자신의 함수를 호출 합니다. 그럼 조건 n == 1 이 충족 될때까지 n값을 줄여나가면서 계속 자신의 함수를 호출하겠죠? 이게 재귀 호출입니다. 자신의 함수안에서 또 자신을 호출하는거죠.


오버로딩


메서드 이름이 같아야 한다.

매개변수의 개수 또는 타입이 달라야 한다.

리턴타입이 다른것과는 상관 없다.


void sum();
void sum(int a, long b);
// 변수의 개수가 같고 변수 타입의 순서가 달라도 오버로딩이 된다.
void sum(int a, long b);
void sum(int a);
void sum(String a);


장점

메서드 이름으로 기능을 예측 할 수 있다.

메서드 이름을 절약

오류의 가능성을 줄인다.


생성자


생성자는 클래스의 이름과 같아야 한다.

생성자는 리턴 값이 없다.


객체를 만들때 예) Sum s = new Sum();

Sum(); 에 해당하는 부분이 생성자 이고 앞에 있는 new 가 인스턴스를 만든다.

생성자가 인스턴스를 만드는것이 아니다.

생성자를 만들지 않으면 기본 생성자 아무 내용도 없는 생성자를 만든다.

생성자는 멤버 변수를 초기화 해주기 위해서 사용된다.

Sum() {

a = 1;

hello = "안녕하세요";

}


매개변수가 있는 생성자도 만들 수 있다.

Sum(int c, String d) {

a = c;

hello = d;

}

객체를 만들고 초기에 변수값을 넣어줄때는

car c = new Car();

c.a = 1;

c.hello = "안녕하세요";


보다는


Car c = new Car(1, "안녕하세요");  가 더 간결하고 직관적이다.


같은 크래스 안에서 생성자를 호출 할때는 this() 를 사용한다.

제일 첫 줄에 사용해야함

car(){

this("white", "auto", 4);

}

car(String color, String gearType, int door){...}


this 는 변수를 구별할때도 사용됨

int color;

color(int color) {

this color = color;

}

this 가 붙은건 클래스안에 있는 변수



초기화


초기화 3가지 방법

명시적 초기화

class car {
int door = 4;                     //기본형 변수 초기화
Engine e = new Engine(); //참조현 변수 초기화
}

초기화 블럭

아무것도 없이 블럭만 사용하거나 static을 붙이는 초기화

{  인스턴스 초기화 블럭 }
static{ 클래스 초기화 블럭 }

초기화 생성자보다 먼저 실행된다.


클래스 변수 초기화 순서 : 기본값 -> 명시적 초기화-> 클래스 초기화 블럭
인스턴스변수의 초기화 순서:기본값-> 명시적 초기화-> 인스턴스 초기화 블럭-> 생성자


클래스 초기화 블럭은 처음에 1번
인스턴스 초기화 블럭은 객체가 만들어 질때마다 실행

static 이 붙은 블럭 안에는 인스턴스 변수 , 함수 가 오면 안된다.}







20150912



자바 객체지향 프로그래밍(Java Object-oriented Programming)


변수(Variables)



변수 : 단 하나의 값을 저장할 수 있는 공간

변수 선언 방법

int number;    [변수타입 변수이름;]


기본형 변수와 참조형 변수

기본형(Primitive type) : Boolean, char, byte, short, int, long, float, double
참조형(Reference type): 8개 기본형을 제외한 나머지 타입, 객체의 주소를 저장 
참조형 변수 선언 방법
HelloWorld hw;      [ 클래스 이름 변수명;]
 
* 기본형은 기본형 값이 복사 되지만 참고형은 값을 저장한 곳의 주소를 저장합니다.



형변환(casting)

형변환: 변수의 타입을 다른 타입으로 변환하는 것

(타입)피연산자
int a = (int)85.7;

85.4 double 형 값을 int 형으로 변환하여 a 에 저장
int 형정수형이기 때문에 값은 85로 변경 ( 소수점 값은 무조건 버려진다.)
                            

타입이 작은거에서 큰것으로 갈때는 생략 가능    작은 타입-> 큰 타입 = 생략 가능
타입이 큰것에서 작은것으로 갈때는 생략 불가능 작은 타입<- 큰 타입 = 생략 불가능 




변수에는 3가지 종류가 있습니다.

변수 종류 -클래스변수, 인스턴스변수, 지역변수

변수는 선언된 위치에 따라 종류가 달라지기 때문에 어느 영역에 선언 되었는지를 봐야 합니다. 우선 코드 예시를 보도록 할게요.

public class Variables {
	
	int iv; //인스턴스 변수
	static int cv; // 클래스 변수 (Static 변수)
	
	void method() {
		int lv = 10;   //지역변수
	}	
}

iv 는 인스턴스 변수

cv  는 클래스 변수

lv 는 지역변수

입니다. 

우선 인스턴스변수(instance variable) 설명입니다.

클래스 영역에 선언되고 인스턴스(객체)가 생성할 때 만들어 집니다. 그래서 객체를 만들기 전에는 인스턴스변수를 사용할 수 없죠 사용하기 위해선 먼저 객체를 만들어야 합니다.
인스턴스 변수는 생성될 때 마다 생성되기 때문에 각기 다른 값을 갖습니다.


다음은 클래스 변수(class variable)
클래스 변수를 선언하는 방법은 클래스 변수는 변수 앞에 static 을 붙여주면 됩니다.  클래스 변수는 class가 로딩 될때 만들어져서 프로그램이 종료될때 까지 유지하기  때문에 객체를 만들지 않고도 사용할 수 있습니다. '클래스명.클래스변수' 이런 식으로 사용이 할 수 있죠
또한 클래스 변수는 모든 인스턴스가 하나의 저장공간을 유지합니다. 그래서 항상 공통된 값을 유지합니다.

지역변수(local variable)
메서드 안에서 선언되어서 메서드 안에서만 사용이 가능하고 메서드가 종료되면 지역변수는 사용할 수 없습니다.
예를 들면 for 문에서 블럭{} 안에서 선언된 변수는 그 안에서만 사용이 가능합니다.

코드 예시로 변수들을 설명 하겠습니다.
public class Variables {
	
	int iv; //인스턴스 변수
	static int cv; // 클래스 변수 (Static 변수)
	
	void method() {
		int lv = 10;   //지역변수
	}	
	//lv = 20; 이 영역은 method 블럭{} 밖에 있기 때문에 사용 할 수 없습니다.
}
class test {
	public static void main(String[] args) {
		
		Variables.cv = 10; // cv 는 클래스 변수이기 때문에 객체를 만들지 않고 사용 할 수 있습니다.
	//	Variables.iv = 10; 오류 발생 iv 는 클래스 변수이기 때문에 객체를 만들지 않고 사용 할 수 없습니다.
		
		Variables v = new Variables(); // 변수 iv 를 사용하기 위해 객체를 만들고
		v.iv = 20;                     // 객체의 주소가 담긴 변수 v 를 이용해 iv 변수를 사용합니다.
	}
}	

3번 4번 7번 줄은 각각 인스턴스변수, 클래스변수, 지역변수 를 선언한 모습입니다.그리고 9번줄은 method() 함수 블럭{} 밖에서 사용을 해서 오류가 나는 잘못 된 코드 입니다.

14번 줄 처럼 클래스 변수는 객체를 만들지 않고도 '클래스명.변수명' 으로 사용할 수 있지만 15번 줄 처럼 인스턴스 변수를 '클래스명.변수명' 처럼 사용하면 오류가 납니다.

그래서 인스턴스 변수를 사용하기 위해서는 17번 줄 처럼 객체를 만들어서 사용해야 합니다.











 






20150911



자바 객체지향 프로그래밍(Java Object-oriented Programming)


자바 객체지향의 장점 - 재사용성 , 유지보수, 중복제거

자바는 객체지향 언어 입니다. 객체지향 언어는 코드의 중복을 줄이고 재사용성은 높여 프로그램의 개발과 유지보수 시간과 비용을 줄여줍니다. 

앞으로 자바를 공부해 나갈때 재사용성, 유지보수, 중복제거 를 기억하시면 자바를 이해하는데 도움이 되겠죠

자바의 역사나 사전적인 정의는 넘어가도록 할게요.


클래스와 객체

우선 클래스와 객체 입니다.

클래스는 설계도 도면(붕어빵틀, 건물 설계도) 이라고 할 수 있고 객체는 설계도로 만들어진 객체(사물-붕어빵, 자동차, 책상) 라고 할 수 있습니다.

예를 들어 붕어빵틀이 있으면 붕어빵틀 하나로 여러개의 붕어빵을 만들 수 있는 것처럼 하나의 클래스로 여러개의 객체를 만들어 사용하게 됩니다.






자바 JDK(java Development Kit)은 수 많은 다양한 기능을 하는 클래스(Java API)를 제공해주죠 이러한 API 가 가지고 있는 클래스를 이용하면 더 쉽고 빠르게 프로그램을 개발 할 수 있는거죠 - 이미 가지고 있는 붕어빵틀로 바로 붕어빵을 만들고 이미 가지고 있는 아파트 도면으로 바로 아파트를 만들면 되는것 처럼 말이죠



객체와 인스턴스


어떤 클래스로 만들어진 객체를 그 클래스의 인스턴스라고 부르죠 - (인스턴스와 객체는 같은 말이라는걸 기억하세요!)

예를 들어 붕어빵 틀 클래스로 만들어진 객체를 붕어빵틀 클래스의 인스턴스 라고 말합니다.


객체는 여러 속성과 기능을 가지고 있습니다.

우선 속성과 기능이 뭐냐 하면 속성은 명사 라고 생각하시면 돼요. 그리고 기능은 동사라고 생각하세요.

사람을 예로 든다면

속성- 키, 이름 , 주민등록번호, DNA

기능- 일어나기, 앉기 , 밥먹기, 공부하기, 대화하기


프로그래밍에서는

속성-     int a =1 ;         String name="yichi";

기능-    더하기, 빼기, 곱하기 , 평균값 구하기 처럼 어떤 기능을 해주는 행위(behavior), 함수(function), 메서드(method) 라고 합니다.


속성과 기능을 부르는 용어들이 다양합니다.

속성 - 멤버변수(member variable), 특성(attribute) ,필드(field), 상태(state) 

기능 - 메서드(method), 행위(behavior), 함수(function)

이런 다양한 용어들로 속성과 기능을 말하는데 같은 의미라는걸 아시면 됩니다. 그리고 객체가 가지고 있는 속성과 기능을 합쳐서 멤버라고 부릅니다.


그럼 직접 사람 클래스를 만들어 보면 다음과 같습니다.

public class Man {
   //사람의 속성
  int height;  //키
  int age;        //나이

  //Man 기능(함수)
  void growth() {    ++age; }  //성장(growth)함수는 나이가 1증가하는 기능(함수)
  void eat()  { ++height; }    //먹다(eat)함수는 키가 1 증가 하는 기능(함수)
	

}

위 코드에서 처럼 속성은 값 들을 저장하고 함수는 어떤 특정한 기능을 해주죠

클래스를 만들었으니 인스턴스를 생성해 볼게요.


클래스명 변수명; //클래스 객체를 참조하기 위해 참조변수를 선언해 주고

변수명 = new 클래스명(); //래스 객체를 생성 후 객체의 주소를 참조변수에 저장합니다.


Man m;

m = new Man();


위에서 만들었던 코드로 객체를 만들면
 
public class Man {
   //사람의 속성
  int height;  
  int age;        
 
  //Man 기능(함수)
  void growth() {    ++age; }  
  void eat()  { ++height; }  
     
 
}

class ManTest {
	public static void main(String[] args) {
		Man m;            //Man인스턴스(객체)를 참조하기 위해 변수 m을 선언합니다.
		m = new Man();    //Man 인스턴스(객체)를 생성합니다.
		
		m.age = 20;         //Man 인스턴스 멤버변수 age를 20로 합니다.
		m.growth();        //Man 인스턴스 메서드(기능) growth()를 호출 합니다.

        //변수값 입력과 growth() 함수가 잘 실행 되었는지 출력해 본다.
        System.out.println("현재 사람의 나이는" + m.age + "입니다."); 	
       }
}

위에 결과값은 21이 출력 됩니다.

이러한 방식으로 인스턴스(객체)를 만들고 사용 할 수 있습니다.








 

 

'프로그래밍 > java' 카테고리의 다른 글

java 메서드(method)  (0) 2015.09.12
Java 변수(Variables)  (0) 2015.09.12
[Java] 자바 주석 사용법 (java comment)  (0) 2015.09.07
자바(Java Programming Language)  (0) 2015.09.06
Java 시작(Starting Java)  (0) 2015.09.06

2015/09/07



주석(comment)


주석이란건 프로그래밍한 코드를 자신 또는 다른사람들이 보고 쉽게 이해 할 수 있게 설명을 덧붙여 놓은 겁니다. 작성 날짜나 버전 변경이력들을 적어 놓는 공간이기도 하고요. 그런데 정말로 그냥 써버리면 오류가 나버리니깐 이부분은 설명부분이다 라는걸 구별해주는게 주석입니다.(그냥 글을 써버리면 오류로 인식을 하겠죠 개발툴을 사용하고 있을테니깐요 ㅎ)


범위 주석: /* 와 */ 사이 내용은 주석으로 간주 하는겁니다.

/*

 지금 쓰고 있는 내용은 주석입니다.

컴퓨터가 실행될 때 코드로 인식하지 않아요

*/

실제 코드 화면으로 본다면 

ㅁ 


한 줄 주석: // 부터 그 줄 끝까지 입니다.

// 이줄은 주석인데

여기는 주석이 아닙니다. 

실제 코드 화면으로 본다면

ㅁ 


컴퓨터(컴파일러)가 코드를 실행할때 주석을 처리하면 그부분은 코드로 인식안하고 무시하고 넘어갑니다. 그러니깐 주석을 안읽고 넘어 간다는 의미이기 때문에 주석이 길다고 속도가 느려지거나 성능이 떨어지는건 아닙니다.

다만 " "  사이는 문자열(String)으로 인식해서 그 안에 주석을 쓰면 주석으로 인식하지 못해요.

System.out.println("/* 주석이 아니에요 */");

System.out.println("//주석이 아니에요");

출력문은 

/* 주석이 아니에요 */

//주석이 아니에요


실제 코드 화면으로 본다면

ㅁ 




'프로그래밍 > java' 카테고리의 다른 글

Java 변수(Variables)  (0) 2015.09.12
객체 지향 프로그래밍(java Object-oriented programming)  (0) 2015.09.11
자바(Java Programming Language)  (0) 2015.09.06
Java 시작(Starting Java)  (0) 2015.09.06
indexof() 함수 사용하기  (0) 2015.03.29

2015/09/06



자바소개


자바는 운영체제에 독립적입니다. 쉽게 말해서 한번 코딩하면 윈도우(window)를 사용하던 리눅스(Linux)를 사용 하던 상관없이 실행이 가능하다는 장점이 있어요. 자바가 아닌 다른 언어는 운영체제(window or Linux)에 따라서 코딩을 각자 해줘야 하는 불편함이 있었는데 이걸 해결 했다는 말이죠.


자바는 많은 Java API 를 가지고 있습니다. 이미 코딩이 되어 있는? Java API 가 있어 쉽게 다양한 기능들을 사용 할 수 있습니다. (api는 쉽게 누군가가 기능(예_현재시간 알려주는 기능)들을 구현해 둔걸 그저 쓰기만 한다고 생각하시면 편해요.)


자바는 메모리를 쉽게 관리합니다. 하나하나 사용하지 않는 메모리를 지워주거나 그런 불편한 작업 없이 자바가 가지고 있는 가비지컬렉터(garbage collector)가 사용하지 않는 메모리를 지워주죠 프로그래머가 할일을 줄여 준겁니다. 하지만 비효율적인 부분도 있답니다.


자바는 멀티쓰레드를 지원합니다. 멀티쓰레드는 멀티테스킹이라고 생각하면 됩니다. 컴퓨터는 엄청나게 빠른 속도로 일하지만 하나 하나씩 일을 수행하는데 멀티쓰레드를 사용하면 동시에 2가지 3가지 일을 할 수 있어요. 핸드폰 하면서 친구와 대화 하는것 같은 동시에 여러가지 일을 하는거죠.


자바는 분산처리와 네트워크를 지원합니다. 네트워크는 2번째에서 말한 java API가 네트워크 관련된 부분들을 가지고 있어서 쉽게 네트워크 프로그램을 개발 할 수 있습니다. 분산 처리는 한곳에서 모든것을 처리하는 집중 처리와 대비되는 의미인데

여러개의 처리장치로 분산시켜서 일을 하는것을 분산처리 라고 한답니다.


JVM(Java Virtual Machine)


JVM 은 java를 실행시켜주는 소프트웨어 입니다. java는 오직 JVM 하고만 상호작용 하죠. 자바가 운영체제에 독립적이라고 한 것 기억하시죠? (기억 안나면 다시 읽어보세요 ㅎ) 바로 JVM 때문에 가능한겁니다. java로 이루어진 어플리케이션은 오직 JVM 하고만 상호작용을 하고 그 JVM 은 OS(window or Linux) 와 상호작용을 합니다. 그래서 OS(window or Linux) 에 맞는 JVM만 가져오면 java 어플리케이션은 각각의 OS에 맞게 코딩해줄 필요가 없는거죠. 이런 장점이 바로 한번 작성하면 어디서든 실행된다. "Write once, run anywhere"입니다.


OS 마다 다른 의사소통 방식이 있는데 그거에 맞게 코딩을 해주거나(java 가 아닌 언어들) 중간에서 번역자(JVM)이 필요한거죠.

즉 JVM이 java와 OS 중간에서 통역을 해주는 겁니다.




   참조 그림1 ( Java는 JVM과 상호작용을 하고 / 다른 어플리케이션은 OS와 상호작용한다.)




참조 그림2 (java 어플리케이션은 동일하고 OS에 맞는 JVM으로 똑같은 어플리케이션을 실행 할 수 있다.)


2015/09/06



자바 시작


오늘부터 자바공부 를 다시 시작했습니다. 


제가 공부하는 책은 자바의 정석 2nd Edition 와 Head First 입니다. 이 책들에 대해 공부해 나가면서 Chapter 별로 공부한것들을 정리 하려고 합니다. 필요하신 부분이 있으면 링크Chapter 를 클릭하셔서 필요한 부분 얻어 가셨으면 좋겠어요.ㅎ 



준비_자바개발 환경 구축(Installing Java)



Chapter 1_

자바(Java Programming Language):자바 소개


Chapter 2_

변수(Variable)


Chapter 3_

연산자(Operator)

Chapter 4_
조건문과 반복문(Conditionals, Loop)

Chapter 5_

배열(Array)


Chapter 6_

객체지향 프로그래밍1


Chapter 7_

객체지향 프로그래밍2


Chapter 8_

예외처리(Exception Handling)


Chapter 9_

java.lang 패키지


Chapter 10_

내부 클래스


Chapter 11_

컬렉션 프레임웍과 유용한 클래스


Chapter 12_

쓰레드(thread)


Chapter 13_

AWT(Abstract Window Toolkit)


Chapter 14_

입출력(I/O)


Chapter 15_

네트워킹(Networking)


기타

향상된 for문

오토박싱

타입에 안전한 열거형

가변인수

static import문 

StringBuilder






indexof() 함수를 설명할게요 ㅎ


예)

 String str = "인덱스오브함수란";

    String n = str.indexOf("오브");


n 의값은 3 이 나오게 되죠 ㅎ


indexOf() 함수 파라미터 값인 오브 라는 글자가 처음 나오는 인덱스 번호를 return 해 주죠


인덱스오브함수란

 0 1 2 3 4 5 6 7   <- 각 문자열의 인덱스 값


오브 라는 단어에 맨처음 인덱스는 3입니다.

바로 이것을 반환해 주는거죠 ㅎ

         

 




substirng() 함수 인자가 하나인것과 두개인것을 설명할게요ㅎ 



문자열 "일이삼사오" 를 예로 든다면 

  (문자 하나당 인덱스 번호가 0 1 2 3 4 순입니다 ㅎ)


"일이삼사오".substring(2)를 하면 "삼사오"가 return 되죠

"일이삼사오".substring(3)를 하면 "사오"가 return 되죠


감이 잡힐거예요 ㅎ 

문자열 첫번째부터 인덱스 0, 1, 2 숫자가 붙는다고 생각하면

substring(int index)     index에 들어갈 숫자 이후 문자열을 반환(return)해 주는것이죠



substring(int startIndex , int endIndex)  의 경우  (substring 함수에 파라미터 인자가 2개인 경우)


이번엔 예시 문자열을 "abcdefg" 로 해보겠습니다 ㅎ

"abcdefg".substring(4,6)를 하면 "ef" 가 return 되죠

 0123456   <- 인덱스 번호

4, 5 인덱스 문자열이 반환 되는거죠


startIndex 첫번째 파라미터 값에서 이 값을 포함하면서 가져옵니다 ㅎ


endIndex 종료 인덱스에서 이 값 바로 전까지 가져오는것이죠 (endIndex는 가져오지 않아요!)


+ Recent posts