JAVA

[ JAVA ] - 필드와 메서드

algml0703 2022. 8. 19. 23:02
반응형

클래스

쉽게 이야기하면 일정한 형식을 갖춘 틀이라고 볼 수 있으며, 클래스를 통해 인스턴스를 생성한다. 인스턴스는 해당 틀을 통해 만들어진 객체이다.
* 클래스로부터 생성된 인스턴스는 힙메모리에 생성된다. 클래스를 통해 생성된 각각의 인스턴스는 다른 메모리에 서로 별개의 값을 가진다. 사용되지 않는 인스턴스는 가비지 컬렉터에 의해 지워진다.
* 클래스는 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.inflearn.com/course/%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EC%9E%85%EB%AC%B8#curriculum

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