2020. 10. 30. 09:07ㆍWeb_Back-end/Java SE
◎ 객체화
클래스명 객체명 = new 클래스명();
접근지정자, instance변수 다른클래스, 서브패키지에서 사용해보기(import) => day_7 의 instance변수 사용하는 법
◎ variable _ 변수
- variable _ 변수
- 목적 : 프로그램에서 사용할 값을 메모리에 일시적으로 저장하기 위해
- java에서는 istance variable, static variable, local variable 3가지 종류를 제공한다
- 변수를 선언하는 위치에 따라 다른 변수가 만들어진다
- 각각의 변수는 생명주기와 사용범위, 사용방법이 다르다
변수종류 | instance(member)variable | ||
특징 | class field 에 선언한다 | ||
객체화하여 사용하는 변수 | |||
class를 객체화하면 객체마다 변수 생성 | |||
자동초기화 (개발자가 초기화값을 넣지 않아도 된다) |
|||
객체가 Garbage Collector 에 의해 사라질 때 메모리에서 사라진다 | |||
JVM 의 heap 메모리에 생성된다 | |||
static 영역에서는 instance 영역에 직접 접근할 수 없다 =사용방법=> 객체화 | |||
생성되는 객체마다 변수의 값을 따로 저장하고 사용해야할 때 사용(class 배울때 다시배움) | |||
작성법 | access modifier (접근지정자, 접근제한자, 접근수정자 _ 다 사용하는 용어) access modifier data type variable name = default value; 접근지정자 데이터형 변수명 = 초기화값; |
||
사용방법 | class Test{ int i; //instance 영역에 선언된 instance변수 public static void main(String[] args){ //static 영역 Test t = new Test(); //객체화 : 클래스명 객체명 = new 클래스명(); System.out.println( t.i ); //변수의 사용 : 객체명.변수명 Test t1 = new Test(); System.out.println( t1.i ); } } |
||
Java Test |
|||
instance 변수의 초기화 값 |
- instance변수를 선언하고, 필요한 곳에서 객체를 생성하면(객체화)
|
◎ static variable
변수종류 | static(class) variable |
특징 | 공용변수 - 하나의 자원을 여러 대상들이 공유하고 사용하는 것 |
실행중인 JVM에서 하나만 만들어지고 사용된다 | |
자동초기화가 된다 | |
클래스가 실행되면 memory 에 올라간다 | |
instance 변수보다 참조하는 속도가 빠르다 | |
값이 변경되면 변경된 값으로 모두 사용하게 된다_공용변수이기 때문에 | |
사용하지 않으면 메모리를 계속 점유하고 있기 때문에 메모리의 낭비로 이어질 수 있다 | |
선언위치 | class field에 선언한다 |
선언방법 | 접근지정자 static 데이터형 변수명; class Test{ static int i; } |
사용법 | 공용변수는 특정객체에 속해있는 변수가 아니므로 객체명.변수명의 형식으로 사용하지 않는다 (사용되긴 함) ==> 클래스명.변수명 으로 사용한다. ==> Test.i; |
▼static 변수와 instance 변수의 선언과 사용법 차이▼
public class UseStaticVariable {
static int i;//static 변수 - 하나만 생성(공유하여 하나만 사용)
int j;//instance 변수 - 객체마다 생성(각각 사용)
public static void main(String[] args) {
//static변수는 클래스가 실행될 때 메모리에 올라가기 때문에 객체명을 사용하지 않고
//클래스명으로 접근하여 사용한다.
System.out.println(i);
//객체화하여 사용하지 않고 클래스명으로 접근가능
System.out.println(UseStaticVariable.i);
//instance변수는 객체화하여 사용, 객체마다 각각 사용가능
UseStaticVariable usv = new UseStaticVariable();
UseStaticVariable usv1 = new UseStaticVariable();
//instance변수는 객체마다 생성되는 변수이므로 객체명을 사용하여 변수를 접근
usv.j = 1;
usv1.j = 2;
//instance변수는 클래스명으로 접근 불가능하다
// UseStaticVariable.j = 4;
//static변수는 하나만 생성되는 변수이므로 객체명을 사용하여 변수를 접근하더라도
//각각 사용되는 것이 아니다(최후에_맨마지막에 변경된 값으로 사용됨)
//아래처럼 객체명을 사용하여 변수를 사용하는 문법을 권장하지 않는다
// usv.i = 1000;
// usv1.i = 2000;
// System.out.println("usv.j : " + usv.j + ", usv1.j : " + usv1.j);
// System.out.println("usv.i : " + usv.i + ", usv1.i : " + usv1.i);
//
//static변수의 올바른 사용법
UseStaticVariable.i = 10000;
System.out.println(UseStaticVariable.i);
}//main
}//class
◎ method
method | |
특징 | 업무를 구분하여 작성할 때 |
중복코드를 최소화할 수 있다 | |
instance method, static method 2가지로 만들 수 있다 | |
polymorphism 을 지원 (method Overload, method Override) | |
instance method |
클래스의 인스턴스변수를 사용하여 일을 처리하는 method 객체화를 하여 객체명.method명() 으로 호출하여 사용 |
static method |
객체가 가지고 있는 값을 사용하여 일을 처리하는 것이 아닌, 매개변수로 입력된 값을 가지고 일시적인 연산을 할 때 사용 객체화를 하지 않고 클래스명.method명() 으로 호출하여 사용 |
문법 | 접근지정자 반환형 method명 (매개변수..){ 업무구현 } |
method의 접근지정자 |
※ 폴더개념 public : 클래스외부에서 호출 가능 protected : 같은 패키지의 다른 클래스에서 호출 가능 패키지가 다르면 상속관계의 자식클래스에서만 호출 가능 private : 클래스 안에서만 호출 가능 default : 같은 패키지의 다른 클래스에서 호출 가능 패키지가 다르면 호출 불가능 ※ 메모리개념 static : static method로 만들 때 final : Override를 막을 때 synchronized : multi thread에서 동시 호출을 막을 때 |
반환형 return type |
method안에서 업무처리한 결과를 밖으로 내보낼 때 사용 method를 호출한 곳에서 결과 값을 받을 수 있다 void - 반환값 없음 기본형 데이터형과 참조형 데이터형을 설정할 수 있다 |
매개변수(parameter) 지역변수에 해당됨 |
method 외부에 존재하는 값(arguments)을 method 내부로 전달하기 위한 변수 |
method의 호출 방법 | |
예 | class Test{ public methodA(){ } public static methodB(){ } } |
instance method |
1. 객체화 Test t = new Test(); 2. 호출 : 객체명.method명() t.methodA(); |
static method |
1. 호출 : 클래스명.method명() ==> 같은 클래스 안에 있으면 클래스명 생략가능 Test.methodB(); |
▼ instance method 사용예
/**
*instance변수를 사용하여 업무를 처리할 때 주로 만드는<br>
*instance method 의 사용예
* @author owner
*/
public class UseInstanceMethod {
/**
* 태어난 년도를 입력받아 나이를 연산하는 업무<br>
* 연산식 : 올해-태어난해+1<br>
* 올해는 2020년으로 instance variable에 저장되어있다<br>
* @param birth 태어난해
* @return 연산된나이
*/
int year = 2020;
public int getAge(int birth) {
return year-birth+1;
}
public static void main(String[] args) {
//getAge(1996); //static영역은 instance영역보다 먼저 호출되기 때문에
//instance영역의 변수나 method를 직접 호출할 수 없다
//1. 객체화 : static영역에서 instance영역의 자원(변수, method)을 사용하기 위해
UseInstanceMethod um = new UseInstanceMethod();
//2. method 호출(객체의 값을 사용하여 업무를 처리한다)
int birthYear = 1996; //지역변수
//매개변수를 직접 입력해도 되고, 지역변수 값을 넣어도 됨
// int myAge = um.getAge(1996);
int myAge = um.getAge(birthYear);
System.out.println(birthYear+ "년생은 " + myAge + "살 입니다");
}//main
}//class
▼ static method 사용예
/**
* 입력된 값으로만 업무를 처리하는 static method 사용<br>
*
* @author owner
*/
public class UseStaticMethod {
/**
* 입력되는 수의 절대값을 구하는 일
* @param param 입력되는 수
* @return 입력되는 수의 절대값
*/
public static int abs(int param) {
return param < 0 ? -param:param;
}//abs
public static void main(String[] args) {
//static method는 객체화없이 호출한다
int num = 30;
int num2 = -50;
//같은 클래스에 있으면 클래스 명도 생략 가능
int resultValue = UseStaticMethod.abs(num);
int resultValue2 = abs(num2);
System.out.println(num + "의 절대값은: " + resultValue);
System.out.println(num2 + "의 절대값은: " + resultValue2);
}//main
}//class
◎ method의 4가지 형태
○ 반환형 없는 method
고정적인 일 | 동적인 일 (가변 일) | |
특징 | 1. 반환형 없고(void), 매개변수 없는 형 | 2. 반환형 없고(void), 매개변수 있는 형 |
작성법 | public void typeA(){ }//괄호의 의미는 '호출한 곳으로 돌아가라'라는 의미다 |
public void typeB(매개변수){ } |
호출 | 객체명.method명(); =>객체명.typeA(); |
객체명.method명(값); =>객체명.typeB(값); |
호출할 때에는 method의 매개변수 갯수와 데이터형을 일치시켜야함 |
||
예시 | public typeA(){ } |
public void typeB(int i, char c){ } 호출) 매개변수 갯수와 데이터형을 일치 객체명.typeB(30, 'A'); |
○ 반환형 있는 method
고정 값 | 가변 값 | |
method가 반환형을 가지고 있다면 method의 가장 마지막 줄에 반드시 return 을 정의해야한다 return 은 값을 반환할 때 사용 문법 ) return 값; 값 에는 상수,변수,연산식이 들어갈 수 있다 |
||
특징 | 3. 반환형 있고, 매개변수 없는 형 | 4. 반환형 있고, 매개변수 있는 형 |
작성법 | public int typeC(){ . . 소스코드 . return 값; //값을 반환해 } //호출한 곳으로 돌아가기 |
public int typeD( 매개변수 ){ . . 소스코드 . return 값; } |
호출 | 변수에 할당하거나, 연산에 참여 시킬 수 있다 객체명.method명(); |
변수에 할당하거나, 연산에 참여 시킬 수 있다 객체명.method명 (값); |
예 | public int typeC(){ . . 소스코드 . return 30; } int i = 객체명.typeC(); System.out.println( i ); ==> 30 이 출력된다 |
public int typeD( char c ){ . . 소스코드 . return (int)c; } int value = 객체명.typeD( 'A' ); System.out.println( value ); ==> 65 가 출력된다 |
▼ 4가지 종류의 method 사용 예
/**
* method의 4가지 형태
* @author owner
*/
public class MethodType {
/**
* 1. 반환형 없고 매개변수 없는 형 : 고정 일
*/
public void typeA() {
System.out.println("고정 일");
}//typeA
/**
* 2. 반환형 없고 매개변수 있는 형 : 가변 일
* @param i 입력값
*/
public void typeB(int i) {
System.out.println("가변 일 " + i);
}//typeB
/**
* 3. 반환형 있고 매개변수 없는 형 : 고정 값
* @return 정수값
*/
public int typeC() {
return 30;
}
/**
* 4. 반환형 있고 매개변수 있는 형 : 가변 값
* @param c
* @return c를 정수형으로 변환한 값
*/
public int typeD(char c) {
return (int)c;
}
public static void main(String[] args) {
//객체화
MethodType mp = new MethodType();
mp.typeA();
mp.typeB(10);
int today = mp.typeC();
System.out.println(today);
int code = mp.typeD('A');
System.out.println(code);
}//main
}//class
2020.11.2 배울 내용
- 가변 인자형 : Variable Arguments
- Overload(Overloading)
- OOP-클래스(7가지 형태), JVM memory
- p.283~
▽ 문제풀면서 복습하기 ▽
package day1102;
/**
*method를 작성하고 호출하세요.
1. 자신의 나이를 반환하는 일.
2. 구구단 2단을 출력하는 일.
3. 정수를 입력받아 그 수가 숫자, 영문자대문자, 영문자 소문자의 코드값에
포함 된다면 해당 문자를 그렇지 않으면 '!' 문자를 반환하는 일.
4. 입력받은 단이 2~9단 사이일때는 구구단을 출력하고, 그렇지 않다면
"구구단의 유효범위가 아닙니다."를 출력하는 일.
5. 자신의 성을 문자로 반환하는 일. 예) 이름이 홍길동이라면 '홍' 을 반환합니다.
* @author owner
*/
public class Homwork1 {
/**
* 1. 자신의 나이를 반환하는 일.
* @param thisyear
* @param birthyear
* @return age
*/
public static int age(int thisyear, int birthyear) {
return thisyear-birthyear+1;
}
// //1번 이렇게 사용하면 instance method
// int y = 2020;
// int b = 1996;
// public int age2() {
// return y=b+1;
// }
/**
* 2. 구구단 2단을 출력하는 일.
*/
public static void gugudan_2dan() {
for(int i=1; i<10; i++) {
System.out.println(2 + " x " + i + " = " + 2*i);
}
}
/**
* 3. 정수를 입력받아 그 수가 숫자, 영문자대문자, 영문자 소문자의 코드값에
* 포함 된다면 해당 문자를
* 그렇지 않으면 '!' 문자를 반환하는 일.
* @param value
* @return
*/
char result = (char)33;
public char codeValue(int value) {
if(value >= 48 && value <=57) {
return (char)value;
}//숫자의 범위
else if(value >= 65 && value <= 90) {
return (char)value;
}//영문자대문자의 범위
else if(value >= 97 && value <= 122) {
return (char)value;
}//영문자소문자의 범위
else {
return result;
}//모두 아닌 값이 들어올 때 반환되는 !
}
/**
* 4. 입력받은 단이 2~9단 사이일때는 구구단을 출력하고,
* 그렇지 않다면 "구구단의 유효범위가 아닙니다."를 출력하는 일.
* @param gugu 구구단의 단 입력
*/
public void gugudan(int gugu) {
if(gugu >= 2 && gugu <= 9) {
for(int i=1; i<10; i++) {
System.out.println(gugu + " x " + i + " = " + gugu*i);
}
}//if 문
else {
System.out.println("구구단의 유효범위가 아닙니다");
}
}
/**
* 5. 자신의 성을 문자로 반환하는 일. 예) 이름이 홍길동이라면 '홍' 을 반환합니다.
* @return 남
*/
public static String myName() {
return "남";
}
public static void main(String[] args) {
//1번문제
int myAge = age(2020, 1996);
System.out.println("나의 나이는: " + myAge);
//2번문제
gugudan_2dan();
//객체화
Homwork1 hw1 = new Homwork1();
//3번문제
int userNum = 122;
System.out.println(userNum + " 코드값의 문자는 " + hw1.codeValue(userNum) + " 이다.");
//4번문제
hw1.gugudan(10);
//5번문제
System.out.println("저의 성씨는 " + myName() + "입니다");
}//main
}//class
'Web_Back-end > Java SE' 카테고리의 다른 글
[Java] 2020.11.03. day_10 getter,setter,생성자,추상화하여 클래스 만들기 (0) | 2020.11.03 |
---|---|
[Java] 2020.11.02. day_9 가변인자형, printf, 다형성(Overload,Override), OOP(객체지향), 클래스(작성방법,종류) (0) | 2020.11.02 |
[Java] 2020.10.29. day_7 Tip(자바 JDK 버전바꾸기, 저장시 자동컴파일) (0) | 2020.10.29 |
[Java] 2020.10.29. day_7 반복문(for-each,while,do~while), instance변수,접근지정자 (0) | 2020.10.29 |
[Java] 2020.10.28. day_6 package, for문, eclipse (0) | 2020.10.28 |