클래스
쉽게 이야기하면 일정한 형식을 갖춘 틀이라고 볼 수 있으며, 클래스를 통해 인스턴스를 생성한다. 인스턴스는 해당 틀을 통해 만들어진 객체이다.
* 클래스로부터 생성된 인스턴스는 힙메모리에 생성된다. 클래스를 통해 생성된 각각의 인스턴스는 다른 메모리에 서로 별개의 값을 가진다. 사용되지 않는 인스턴스는 가비지 컬렉터에 의해 지워진다.
* 클래스는 new 예약어를 통해 사용한다. [ 클래스형 ] [ 변수명 ] = new [ 생성자 ] ex) Student studentA = new Student();
* JVM이 Main 함수를 호출하여 프로그램을 실행한다. 즉 해당 클래스 내에서 함수만 생성하고 실행이 필요하지 않은 경우 Main 함수를 만들지 않아도 된다.
* 한 파일에서 여러 클래스를 만들 때 해당 클래스에 public을 붙일 수 있는 것은 해당 파일명과 클래스명이 동일한 경우에만 가능하다.
- 자바 프로그램의 기본이 되는 클래스는 상태를 표현하는 필드와 행위를 표현하는 메서드로 구성된다.
* 변수 (variables) : 메모리에 값이 할당되는 공간으로써 할당되는 값이 변할 수 있다. 예를 들어 a에 1을 할당하면 a는 1이되고, 다시 2를 할당하면 a는 2가 된다.
- 지역변수(Local Variables)
- 정적변수(Class Variables)
- 매개변수(Parameter Variables)
- 인스턴스 변수(Instance Variables) ~ 인스턴스를 생성할 때 메모리 공간을 할당받는 변수
public class VariablesTypes {
/** 정적 변수 */
public static int classVar = 1;
/** 인스턴스 변수 */
private int instanceVar;
/**
* @param paramVar 매개변수
*/
public static void main(String[] paramVar) {
/** 지역변수 */
int localVar = 10;
}
}
*상수 (constants) : 한 번 값이 할당된 후에는 값이 고정된다. a를 상수로 선언하고 1을 할당하고 나면 a에는 더 이상 다른 값을 할당할 수 없다. a는 1의 값으로서만 사용할 수 있다. 자바에서 상수를 선언할 때는 final을 이용한다.
클래스 정의 방법
[ 접근제어자 ] class [ 클래스명 ] { 멤버변수; 메서드 ; }
- 클래스명은 보통 대문자로 시작
- 패키지명은 보통 소문자로 시작
** 패키지 : 소스 코드를 관리를 용이하게 하기 위한 목적으로, 소스의 묶음으로 볼 수 있다.
package hiding;
class BirthDay {
private int day;
private int month;
private int year;
public int getDay() {
return day;
}
public void setDay(int day) {
if (month == 2) {
if (day < 1 || day > 28) {
System.out.println("날짜 오류입니다.");
}
}
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
}
public class BirthDayTest {
public static void main(String[] args) {
BirthDay day = new BirthDay();
day.setMonth(2);
day.setYear(2018);
day.setDay(30);
}
}
자바의 접근 제어자
1) public : 언제나 클래스에 접근 가능하다
2) protected : 동일 패키지 내의 모든 클래스에 접근 가능하며, 동일 패키지가 아닌 경우라고 상위 클래스에서 protected로 선언한 멤버는 해당 상위클래스를 상속받은 하위클래스에서 접근 할 수 있다.
3) default : 접근제어자를 명시해주지 않는 경우에는, 디폴트로써, 같은 패키지 내부에 있는 경우에만 접근 가능하다. 즉 다른 패키지인 경우 접근 할 수 없다.
4) private : 클래스의 외부에서 클래스 내부의 멤버 변수나 메서드에 접근하지 못한다. 해당 클래스 자기 자신만 접근 가능한다.대신에 getter, setter를 생성하여 접근할 수 있도록 할 수 있다. private을 통해 데이터 무결성을 제공할 수 있다.
필드 선언 방법
( static ) ( final ) [접근지정자] [타입] [변수명];
( static ) ( final ) [접근지정자] [타입] [변수명] = [값];
- 필드 선언시 접근지정자 타입 변수명은 필수이다.
public class Main {
public static void main(String[] args) {
int intType = 100;
// 타입 변수명 = 값
// 접근지정자를 생략한 경우에는 default 접근지정자가 적용된다.
double doubleType = 150.5;
String stringType = "oh";
System.out.println(intType);
System.out.println(doubleType);
System.out.println(stringType);
// System.out.println()은 인자로 준 값을 출력하여주는데, 값을 출력후 다음줄로 넘어간다.
}
}
* 변수 선언 규칙
- 변수명은 알파벳, 숫자, _, $ 로 구성된다.
- 변수명은 숫자로 시작할 수 없다.
- 키워드(ex class boolean if switch ...)를 변수명으로 사용할 수 없다.
- 변수명에 공백이 있을 수 없다.
* 자료형
L 기본 자료형 : 정수형 ( int, short, long, byte ) 실수형 ( float, double ), 문자형(char), boolean
L 참조 자료형 : String, Date, Student 등
* 자료형에 따라 차지하는 메모리 크기가 다르다.
자료형
** byte는 주로 동영상, 음악, 파일 등 실행 파일의 자료를 처리할 때 사용된다.
** 기본적으로 자바의 모든 숫자(리터럴)는 int형으로 저장된다.
** 리터럴 : 프로그램에서 사용되는 모든 숫자값, 논리값을 의미한다. 리터럴에 해당하는 값은 특정 메모리 공간인 constant pool 에 있다.
** 32bit를 초과하는 경우에는 long 타입을 사용해야 하며, 숫자의 뒤에 L을 써서, long 형임을 표시해주어야 한다. ex) long num = 12345678900L
** 인코딩 : 각 문자에 따른 특정한 숫자값을 부여
** 디코딩 : 숫자 값을 원래의 문자로 변환
** 문자는 컴퓨터 상에서는 2byte 형식으로 변환되어 처리된다.
** 변수에 문자를 할당하면 문자에 해당하는 코드값이 저장된다.
** 형변환은 변환해주는 자료형을 해당 변수 앞에 괄호에 넣어준다. ex) (int) ch; 이를 명시적 형변환이라 하며, 이 경우 자료의 손실이 일어날 수 도 있다. 예를 들어 실수를 정수로 변환한하는 경우, 소수점아래의 수를 잃게 된다.
package binary;
public class Char {
public static void main(String[] args) {
char ch = 'A';
System.out.println(ch);
// A
System.out.println((int)ch);
// 65
ch = 66;
System.out.println(ch);
// B
int ch2 = 67;
System.out.println(ch2);
// 67
System.out.println((char)ch2);
// C
}
}
package binary;
public class ImplicitConversion {
public static void main(String[] args) {
byte bNum = 10;
int num = bNum;
System.out.println(num);
// 10
long lNum = 10;
float fNum = lNum;
System.out.println(fNum);
// 10.0
double cNum = fNum + num;
System.out.println(cNum);
// 20.0
}
}
** 실수는 기본적으로 double형으로 처리된다. float형으로 사용하는 경우 숫자 뒤에 F를 붙여 주어야 한다. ex) float fNum = 3.14F;
package binary;
public class Float {
public static void main(String[] args) {
double dNum = 3.14;
float fNum = 3.14F;
}
}
Static
프로그램이 메모리에 적재될 때 데이터 영역의 메모리에 생성된다. 여러 인스턴스가 공유하는 값을 선언할 때는 static을 사용한다. static 키원드를 통해 생성된 변수 등은 static 영역에 할당된다. static으로 선언된 것을 클래스 변수라 한다.
** static으로 선언된 변수는 전역데이터로 클래스로드시 공간을 할당한다.
** static으로 선언된 메서드는 클래스 로딩시 공간을 할당하며, 인스턴스의 생성이 불가하다.
Student 클래스
package staticEx;
public class Student {
private static int serialNum = 10000;
int studentID;
String studentName;
public Student() {
serialNum++;
studentID = serialNum;
}
}
StudentTest 클래스
package staticEx;
public class StudentTest1 {
public static void main(String[] args) {
Student studentJ = new Student();
//System.out.println(studentJ.serialNum);
// 일반적으로 static으로 선언한 것을 인스턴스를 통해 사용하지 않고, 클래스 명으로 사용한다.
System.out.println(Student.serialNum);
Student studentI = new Student();
System.out.println(studentJ.studentID);
System.out.println(studentI.studentID);
}
}
변수의 유효 범위
변수유형 | 선언위치 | 사용범위 | 메모리 | 생성과소멸 |
지역변수 | 함수내부에 선언 | 함수 내부에서만 사용 | 스택 | 함수가 호출될 때 생성되고, 함수가 종료될 때 소멸 |
멤버변수(인스턴스변수) |
클래스 멤버 변수로 선언 | private인 경우 클래스 내부에서만 사용, 그 외는 참조 변수로 다른 클래스에서 사용 가능 | 힙 | 인스턴스가 생성될 때 힙에 생성되고, 가비지 컬렉터가 메모리 수거할 때 소멸 |
static변수(클래스변수) | static 예약어를 사용하여 클래스 내부에 선언 | private인 경우 클래스 내부에서만 사용, 그 외는 클래스명으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램에 처음 시작할 때 상수와 함께 데이터 영역에 생성되고, 프로그램이 끝나고 메모리를 해제할 때 소멸됨. |
상수 선언 방법
상수는 final 키워드를 통해 선언하며, main 함수의 바깥에 선언된다. static은 하나의 클래스 내에서 공유되는 자원임을 의미한다.
public class Main {
final static double PI = 3.1415;
public static void main(String[] args) {
int r = 20;
System.out.println(r*r*PI);
}
}
함수 선언 방법
[ 함수 반환형 ] [ 함수명 ] ( [ 매개변수 ] ) { /*return*/ }
* 메서드 : 객체의 기능을 제공하기 위해 클래스 내부에 구현되는 함수를 의미한다.
* 함수는 스택 메모리에 생성된다. 함수가 사라지면 스택메모리에서 사라진다.
* 해당 함수의 반환값이 없는 경우에는 void를 사용한다.
public class Student {
public static void main(String[] args) {
int num1 = 10;
int num2 = 30;
int sum = addNum(num1, num2);
System.out.println(sum);
}
public static int addNum(int n1, int n2) {
int result = n1 + n2;
return result;
}
}
package classPart;
public class Student {
int studentID;
String studentName;
int grade;
String address;
public void showStudentInfor() {
System.out.println(studentName + "," + address);
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
}
생성자 함수 문법 [modifiers] [class_name] ([arguments]) { }
* 클래스에 생성자함수가 하나도 없는 경우에는 자바컴파일러 즉 JVM이 디폴트 생성자를 넣어준다. 디폴트 생성자는 매개변수를 가지지 않는다.
* 생성자는 해당 객체가 실행될 때 무조건 실행되어야 할 내용을 넣어준다.
* 생성자 오버로드 : 하나의 클래스에 여러개의 생성자 함수가 존재하는 경우를 의미한다.
package classPart;
public class Student {
int studentID;
String studentName;
int grade;
String address;
int age;
/*
public Student () {
해당 객체가 실행될 때 나이는 17을 기본으로 하여 생한다.
age = 17;
}
*/
public Student (int sAge) {
// 이와 같이 생성자에 매개변수를 준 경우에는 인스턴스 생성시 반드시 매개변수를 넣어줘야 한다.
age = sAge;
}
public Student (String name) {
studentName = name;
}
public void showStudentInfor() {
System.out.println(studentName + "," + address+","+age);
}
// public Student () {}
// 해당 클래스에 생성자가 하나도 없는 경우에는 자바컴파일러 즉 JVM 디폴트 생성자를 넣어준다.
public String getStudentName() {
return studentName;
}
public void setStudentName(String name) {
studentName = name;
}
/* 해당 클래스에서 함수의 실행이 필요하지 않은 경우 main 함수가 없어도 상관없다. */
public static void main (String[] args) {
Student studentLee = new Student(17);
studentLee.studentName = "ohme";
studentLee.studentID = 2015;
studentLee.address = "busan";
Student studentKim = new Student(18);
studentKim.studentName = "hee";
studentKim.studentID = 1520;
studentKim.address = "seoul";
Student studentOh = new Student("mihee");
studentKim.studentName = "hee";
studentKim.studentID = 1520;
studentKim.address = "seoul";
// Student studentKim = new Student();
// studentKim.studentName = "hee";
// studentKim.studentID = 1520;
// studentKim.address = "seoul";
studentLee.showStudentInfor();
studentKim.showStudentInfor();
studentOh.showStudentInfor();
}
}
주요 개념
This
this는 클래스를 new를 이용하여 인스턴스로 만들어 힙 메모리에 올라간 자신의 메모리를 가리킨다.
package thisex;
class Birthday {
int day;
int month;
int year;
public void setYear(int year) {
this.year = year;
// 반드시 this를 붙여준다.
// year = year 이와 같이 하면 자기자신의 매개변수에 매개변수를 대입하는 것과 같게된다.
// 위와 같은 현상은 기본적으로 자신 자신과 가까운 곳을 참조하는데 Birthday 전역에 선언된 year보다 매겨변수의 year가 더 가깝기 때문이다.
}
public void printThis() {
System.out.println(this);
// this는 현재 자기자신의 인스턴스의 주소값을 의미한다.
}
}
public class ThisExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Birthday b1 = new Birthday();
b1.printThis();
System.out.println(b1);
Birthday b2 = new Birthday();
b2.printThis();
}
}
* 한 클래스 내부에 생성자가 여러개인 경우에 생성자에서 다른 생성자를 사용하려는 경우에도 this를 사용할 수 있다. 이때 this로 호출하는 앞에 다른 어떤 statement도 올 수 없다. 왜냐하면 그 위의 영역은 생성자함수를 통해 인스턴스가 생성되기 이전이기 때문이다.
package thisex;
class Person2 {
String name;
int age;
public Person2() {
this("이름없음",1);
}
public Person2(String name, int age) {
this.name = name;
this.age = age;
}
public Person2 returnSelf() {
return this;
}
}
public class CallAnotherConst {
public static void main(String[] args) {
Person2 p1 = new Person2();
System.out.println(p1);
System.out.println(p1.returnSelf());
}
}
this 사용한 예시)
public class Employee {
private String id;
private String name;
private String department;
public Employee() {}
public Employee(String id) {
this.id = id;
System.out.println("Employee(id) 호출");
}
public Employee(String id, String name) {
this(id);
this.name = name;
System.out.println("Employee(id, name) 호출");
}
public Employee(String id, String name, String department) {
this(id, name);
this.department = department;
System.out.println("Employee(id, name, department) 호출");
}
}
오버 플로
각각의 타입당 값을 할당받을 수 있는 범위가 정해져있다. 예를 들어 정수형인 int 타입이 할당받을 수 있는 최대값은 2147483647 최소값은 -2147483648이다. 때문에 최대값에 1을 더하면서 int타입이 담을 수 있는 값을 벗어나면서 의도대로 실행되지 않고 최솟값으로 돌아가버려 -2147483648을 출력한 것이다.
public class Main {
final static int int_max = 2147483647;
public static void main(String[] args) {
int a = int_max;
System.out.println(a);
// 2147483647
System.out.println(a+1);
// -2147483648
}
}
- 정수를 나타내는 타입에는 short, int, long이 있다.
- 정수로 선언한 변수에 실수를 할당하면 정수부분만 변수에 저장된다.
- 실수 값을 반올림 시에는 (int)를 이용하여 형변환을 할 수 있다. 반올림된값 = (int) (실수 + 0.5)
public class Main {
public static void main(String[] args) {
int a;
double b = 2.63;
a = (int)(b+0.5);
System.out.println(a);
// 3
b = 2.23;
a = (int)(b+0.5);
System.out.println(a);
// 2
}
}
사칙연산
public class Main {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println("a+b="+ (a+b));
System.out.println("a-b="+ (a-b));
System.out.println("a*b="+ (a*b));
System.out.println("a/b="+ (a/b));
System.out.println("a%b="+ (a%b));
}
}
- + : 더하기
- - : 빼기
- * : 곱하기
- / : 나누기
- % : 나머지
논리 연산자
&& (논리 곱) | 두 항이 모두 참인 경우에만, 결과값이 참 |
|| (논리 합) | 두 항 중 하나가 참이기만 하면, 참 |
| (부정) | 단항연산자, 참인 경우 거짓으로 바꾸어주고, 거짓인 경우 참으로 바꾸어 준다. |
출처
https://www.youtube.com/watch?v=wjLwmWyItWI&list=PLRx0vPvlEmdBjfCADjCc41aD4G0bmdl4R
'JAVA' 카테고리의 다른 글
[ Java ] - 기초 예제 (대중 교통 관련) (0) | 2022.09.02 |
---|---|
[ JAVA ] - 프로젝트 생성 후 hello world 찍기 (0) | 2022.08.19 |
[ JAVA ] - 기본 입출력 받기 (0) | 2022.08.19 |
[ JAVA ] - 기초 예제 (0) | 2022.08.19 |
[ JAVA ] - 기본 개념 (0) | 2022.07.27 |