Ch5. Defining Classes(2)
Static Methods
: object 없이 호출하여 사용가능한 method
- static method는 class에 속하며 class definition 내부에서 정의된다.
- static method를 정희할 때 static 이라는 keyoword를 사용한다.
-> pulbic static returnedType myMethod (parameters)
{...}
- static method는 호출 객체 대신 class 이름을 사용하여 호출한다.
ex) returnedValue = Myclass.myMethod(arguments);
Pitfall : Invoking a Nonstatic Method Withn a Static Method
: 정적 메서드 내에서 비정적 메서드 호출
- 정적 메서드는 클래스의 instance variable을 참조할 수 없으며 클래스의 정적 메서드를 호출할 수 없다.
- 정적 메서드에는 this 값이 존재하지 않기 때문에 호출 객체에 대한 암시적,명시적 instance variable 혹은 메서드 사용이 불가하다.
- 다른 정적 메서드를 호출하는 것은 가능하다.
Static Variables
- static variables는 하나의 객체만이 아니라 클래스 전체에 속하는 변수이다.
-> 각 객체가 하나의 복사본을 갖는 instance variable과 달리 클래스당 정적 변수의 복사본은 하나이다.
- 클래스의 모든 객체가 static variables를 읽고 쓸 수 있다.
- static methods는 instance variable에는 접근 불가하지만 static variables에는 접근가능하다.
- static variables는 instance variable처럼 선언되며 static 을 사용하여 선언한다.
ex) private static int myStaticVariable;
- 정적 변수는 선언과 초기화를 동시에 수행 가능하다.
ex) private static int myStaticVariable = 0;
- 명시적으로 초기화되지 않은 경우 자동으로 초기화된다. (초기화 해주는 것이 이상적)
-> boolean type : false, primitive types : 0, class type : null
- 정적 변수는 상수가 아닌 경우 항상 private으로 정의되어야 한다.
-> 정적으로 정의된 상수의 경우 변경불가하므로 public으로 사용 가능하다.
-> 해당 값이 변경불가함을 표현하기 위해 final 수식어를 사용해야 한다.
ex) public static final int BIRTH_YEAR = 1954;
- 클래스 외부에서 상수를 참조하는 경우 클래스명을 사용하여 호출한다.
ex) int year = MyClass.BIRTH_YEAR;
The Math class
: Math 클래스는 많은 수학적 methods를 제공
- java.lang 패키지에 포함되어있어 자동으로 import 되어 사용 가능하다.
- 모든 methods와 data는 static으로 Math 클래스명과 함께 호출된다.
- Math 클래스는 E, PI 두가지 정의된 상수를 갖는다.
Math 클래스의 Methods
1. public static double pow (double base, double exponent)
-> 제곱을 연산
ex) Math.pow (2.0, 3.0) => 8.0
2. public static double abs(double argument)
public static float abs(float argument)
public static long abs(long argument)
public static int abs(int argument)
-> 해당 type 의 값의 절댓값을 return
ex) Math.abs(-6) => 6
3. public static double min(double n1, double n2)
public static float min(float n1, double n2)
public static long min(long n1, double n2)
public static int min(int n1, double n2)
-> 인자로 받은 값 중 최소값을 return
ex) Math.min(3, 2) => 2
4. public static double max(double n1, double n2)
public static float max(float n1, double n2)
public static long max(long n1, double n2)
public static int max(int n1, double n2)
-> 인자로 받은 값 중 최댓값을 return
ex) Math.max(3, 2) => 3
5. public static long round(double argument)
public statci int round(float argument)
-> 인자로 받은 값을 반올림 연산하여 return
ex) Math.round(3.2) => 3 , Math.round(3.6) => 4
6. public statci double ceil(double argument)
-> 인자로 받은 값을 올림 연산하여 return
ex) Math.ceil(3.2) => 4.0, Math.ceil(3.6) => 4.0
7. public static double floor(double argument)
-> 인자로 받은 값을 내림 연산하여 return
ex) Math.floor(3.2) => 3.0 , Math.floor(3.9) => 3.0
8. public static double sqrt(double argument)
-> 인자로 받은 값의 제곱근을 연산하여 return
ex) Math.sqrt(4) => 2.0
Random Numbers
: Math 클래스는 난수를 생성하는 기능을 제공한다.
public static double random()
*Random 클래스는 flexible 한 난수값을 생성한다.
ex) double num = Math.random();
Wrapper class
: 기본 데이터 타입을 객체로 감싸는 클래스
primitive types : byte, short, int, long, float, double, char -> Byte, Short, Integer, Long, Float, Double, Character
- Wrapper class는 정의된 상수나 static methods를 포함한다.
Wrapper class 사용 이유
- 객체 형태로 데이터를 다룰 수 있다.
- 객체로 감싸지 않으면 기본 데이터 타입은 null 값을 가질 수 없다. 하지만 객체로 감싸면 null 값을 가질 수 있다.
- 객체로 감싸면 다양한 메소드를 사용할 수 있다.
Boxing
: 기본 데이터 타입을 Wrapper class의 객체로 변환하는 것
- 새로운 객체에는 원시 값의 복사본을 저장하는 instance variable을 포함
- 다른 클래스와 다르게 wrapper class는 인자 없는 생성자를 갖지 않는다.
ex) Integer integerObject = new Integer(42);
Unboxing
: Wrapper class의 객체를 기본 데이터 타입으로 변환하는 것
ex) int i = integerObject.intValue( );. -> 인자를 갖지 않음
Automatic Boxing and Unboxing
- java 5.0 이후로는 자동으로 boxing , unboxing이 가능하다.
- 이전 설명처럼 new를 사용하여 객체를 생성하는 것이 아니라 자동으로 생성한다.
ex) Integer integerObejct = 42;
- wrapper 클래스 객체에서 원시 데이터 유형으로 변환하는 경우
ex) int i = integerObject;
Constants and Static Methods in Wrapper Classes
-Wrapper 클래스는 최댓값,최솟값을 제공하는 상수를 제공한다.
ex) Integer.MAX_VALUE, Integer.MIN_VALUE, Double.MAX_VALUE, Double.MIN_VALUE
- Boolean 클래스는 두 상수에 대한 이름이 존재
ex) Boolean.TRUE, Boolean.FALSE
- Wrapper 클래스는 문자열 표현의 숫자를 변환하는 정적 메서드를 포함한다.
ex) Integer.parseInt, Long.parseLong
- Wrapper 클래스는 숫자값을 문자열 표현으로 변환하는 정적 메서드를 포함한다.
ex) Double.toString(123.99); -> return "123.99"
- Character class에는 문자열 처리에 유용한 정적 메서드가 포함되어있다.
Character Class의 Methods
1. toUpperCase()
public static char toUpperCase(char argument)
-> 대문자로 변환, 문자가 아닌 경우 변화없음
ex) Character.toUpperCase('a') => return 'A'
2. toLowerCase()
public static char toLowerCase(char argument)
-> 소문자로 변환, 문자가 아닌 경우 변화없음
ex) Character.toLowerCase('A') => return 'a'
3. isUpperCase()
public static boolean isUpperCase(char argument)
-> 대문자인 경우 true 반환, 아닌 경우 false
ex) Character.isUpperCase('A') = > return true
4. isLowerCase()
public static boolean isLowerCase(char argument)
-> 소문자인 경우 true 반환, 아닌 경우 false
ex) Character.isLowerCase('a') => return false
5. isWhitespace()
publci static boolean isWhitespace(char argument)
-> 공백인 경우 true 반환 (빈칸, \t, \n 세 가지 경우에 해당)
ex) Character.isWhitespace(' ') => return true
6. isLetter()
public static boolean isLetter(char argument)
-> 인자가 문자인 경우 true 반환
ex) Character.isLetter('A') => return true, Character.isLetter('5') => return false
7. isDigit()
public static boolean isDigit(char argument)
-> 인자가 정수인 경우 true 반환
ex) Character.isDigit('5') => return true
8. isLetterOrDigit()
public static boolean isLetterOrDigit(char argument)
-> 인자가 문자거나 정수인 경우 true 반환
ex) Character.isLetterOrDigit('A') => true, Character.isLetterOrDigit('5') => true
Variables and memory
대부분의 데이터 유형의 값을 1byte 이상의 저장공간을 필요로한다.
- 여러개의 인접 바이트가 데이터를 유지하는데 사용됨
- 데이터를 저장하는 전체 덩어리를 memory location 이라고 한다.
- memory location의 첫번째 주소를 데이터의 주소로 사용한다.
main memory는 다양한 크기의 memory location의 list로 생각 할 수 있다.
Reference
- 모든 변수는 memory location에서 실행된다.
- 변수가 primitive type인 경우 변수의 값은 할당된 memory location에 저장된다. -> primitive type은 일정 양의 메모리를 필요로 함
- 변수가 class type 인 경우, 객체가 위치한 메모리 주소만 할당된 memory location에 저장
=> primitive type 과 달리 클래스 변수 값은 memory address 혹은 reference 이다.
- 두 참조 변수는 같은 객체를 가리킬 수 있다.
variable2 = variable1; => 같은 객체를 가리킨다.